27 вересня 2016 р.

Компіляція браузера Chromium для Ubuntu (x265, HEVC)


Є перевірена новина, що у експериментальній версії браузера Chromium 55.0.2850 для Windows з'явилася можливість програвати медіа файли формату (HEVC або він же h265).
Але стала необхідність скомпілювати браузера Chromium для операційної системи linux у моєму випадку це Ubuntu 16.04 з можливістю відтворювати формату (HEVC або він же h265).

Офіційна інструкція - Get the Code: Checkout, Build, & Run Chromium (linux)
  1. Створюємо робочу теку:
    $ mkdir chromium
    $ cd chromium
  2. Завантажуємо собі клон репозиторії  depot_tools package.
    $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
  3. Додаємо теку до змінної оточення, додаючи до файлу ~/.bashrc рядок:
    export PATH=$PATH:/path/to/depot_tools
    Пере відкриваємо консоль термінала, і змінна повинна бути завантажена до оточення.
  4. Скрипт для завантаження початкового коду Chromium: \
    $ fetch chromium
    fetch chromium
    Скрипт буде довго працювати в залежності від швидкості Вашого з'єднання з мережею Iнтернет. Після закінчення роботи у Вас буде тека src, і конфігураційний файл .gclient
  5. При першій компіляції необхідно завантажити залежності від інших програм:
    $ cd src
    Надалі усі команди виконуються у теці src.
    $ ./build/install-build-deps.sh
    І по закінченню синхронізувати початковий код  у теці src.
    $ gclient runhooks
  6. Бажано мати або отримати ключі розробника Google :  install API keys
  7. Компілювати будемо до теки  out/Default за допомогою мета системи GN. Вона використовує файл налаштувань BUILD.gn, і генерує файли для системи компіляції Ninja. Визначмо агрументи для створення робочої теки та файлу BUILD.gn.
    $ gn args out/Default
    Відкриється Ваш системний текстовий редактор і потрібно додати наступні значення для Google API keys, та опції модулів компіляції:
    google_api_key = "XXXXXXXXXXXXXXXXXXX"
    google_default_client_id = "YYYYYYYYYYY.apps.googleusercontent.com"
    google_default_client_secret = "ZZZZZZZZZZZZ"
    proprietary_codecs = true
    enable_hevc_demuxing = true
    is_component_build = true
    ffmpeg_branding = "Chrome"
    Де X,Y,Z Ваші власні значення.
    Закривши редактор (для редактора vi це - ESC :wq), буде створено теку out/Default, та файл out/Default/args.gn з цими аргументами. Також build.ninja
    Якщо треба з'ясувати усі можливі аргументи та їх опис то ось весь список:
    $ gn args out/Default --list
  8. Для компіляції браузера Chromium команда:
    $ ninja -C out/Default chrome
    Ціль "chrome". Перелік можливих цілей:
    $ gn ls out/Default
  9. По закінченню компіляції десь 27000 об'єктів, отримаємо файл out/Default/chrome
    Котрий можна запустити на виконання.
Результат компіляції браузер Chromium (Ubuntu)


P.S. Дана публікація є нотаткою для себе що продовжити пізніше, так як на сьогодні 26.09.2016, я не отримав очікуваного результату, h265 файли не програються. А після правок 28.09.2016 вже програються!.

P.S. 1.

Але, треба перевірити цей пост:
I would like to build Chromium myself with HEVC decoder. Can you share your patches?
try this http://pastebin.com/RMUqp2bU 
#file src/third_party/ffmpeg/ffmpeg_generated.gni
#append to your condition

ffmpeg_c_sources += [
    "libavcodec/hevc.c",
    "libavcodec/hevc_cabac.c",
    "libavcodec/hevc_data.c",
    "libavcodec/hevc_filter.c",
    "libavcodec/hevc_mvs.c",
    "libavcodec/hevc_parse.c",
    "libavcodec/hevc_parser.c",
    "libavcodec/hevc_ps.c",
    "libavcodec/hevc_refs.c",
    "libavcodec/hevc_sei.c",
    "libavcodec/hevcdsp.c",
    "libavcodec/hevcpred.c",
    "libavcodec/x86/hevcdsp_init.c",
    "libavformat/autorename_libavformat_hevc.c",
    "libavformat/hevcdec.c"
]
ffmpeg_yasm_sources += [
    "libavcodec/x86/hevc_deblock.asm",
    "libavcodec/x86/hevc_idct.asm",
    "libavcodec/x86/hevc_mc.asm",
    "libavcodec/x86/hevc_res_add.asm",
    "libavcodec/x86/hevc_sao.asm",
    "libavcodec/x86/hevc_sao_10bit.asm"
]


#files src/third_party/ffmpeg/chromium/config/YOUR_BRAND/win/YOUR_ARCH/config.asm + config.h
#add or replace some parameters

#define FFMPEG_CONFIGURATION "******** --enable-decoder='hevc' --enable-demuxer='hevc' --enable-parser='hevc'"
#define CONFIG_HEVC_DECODER 1
#define CONFIG_HEVC_DEMUXER 1
#define CONFIG_HEVC_PARSER 1
За цим напрямком знашйов що можна створити власні конфігураційні
"ffmpeg_branding":
$cd third_party/ffmpeg
Підправити  "chromium/scripts/build_ffmpeg.py" line ~553
  # Google Chrome & ChromeOS specific configuration.
  configure_flags['Chrome'].extend([
      '--enable-decoder=aac,h264,mp3,hevc',
      '--enable-demuxer=aac,mp3,mov,hevc',
      '--enable-parser=aac,h264,mpegaudio,hevc',
  ])
$ cd chromium/scripts
$ ./build_ffmpeg.py linux x64 --branding "Chrome"
$ ./copy_config.sh
Дані конфігурації будуть збережені до теки
"third_party/ffmpeg/chromium/scripts/chromium/config/Chrome/linux/x64"
тепер можемо створити свій branding: ChromeL
Скопіювавши нові конфігуаційні файли до теки "third_party/ffmpeg/chromium/config"
І підправити out/Default/args.gn зміною ffmpeg_branding = "ChromeL"
та "third_party/ffmpeg/ffmpeg_options.gni" line 43:
assert(ffmpeg_branding == "Chromium" ||
       ffmpeg_branding == "Chrome" ||
       ffmpeg_branding == "ChromeL" ||
       ffmpeg_branding == "ChromiumOS" ||
       ffmpeg_branding == "ChromeOS")



$ gn args out/Default

P.S. 2: Є результат!!! 28.09.2016

Тепрер мій браузер Chromium v.55.0.2874.0 (linux x64) може програвати HTML5 відео кодоване форматом h265, HEVC.
Chromium browser 55.0.2874.0 (linux x64) can play HTML5 video h265, hevc

Ось мої правки до станданої компіляції:

$ cd third_party/ffmpeg
Додав до файлу "ffmpeg_generated.gni" наступні рядки:

ffmpeg_c_sources += [
   "libavcodec/hevc_filter.c",
   "libavcodec/hevc.c",
   "libavcodec/x86/hevcdsp_init.c",
   "libavcodec/hevc_parser.c",
   "libavcodec/hevc_sei.c",
   "libavcodec/hevc_data.c",
   "libavcodec/hevc_ps.c",
   "libavcodec/hevc_mp4toannexb_bsf.c",
   "libavcodec/hevcpred.c",
   "libavcodec/hevc_parse.c",
   "libavcodec/hevc_cabac.c",
   "libavcodec/hevcdsp.c",
   "libavcodec/hevc_refs.c",
   "libavcodec/hevc_ps_enc.c",
   "libavcodec/hevc_mvs.c",
   "libavformat/hevcdec.c",
   "libavcodec/x86/bswapdsp_init.c",
   "libavcodec/bswapdsp.c"
]

ffmpeg_yasm_sources += [
   "libavcodec/x86/hevc_res_add.asm",
   "libavcodec/x86/hevc_mc.asm",
   "libavcodec/x86/hevc_sao_10bit.asm",
   "libavcodec/x86/hevc_deblock.asm",
   "libavcodec/x86/hevc_idct.asm",
   "libavcodec/x86/bswapdsp.asm",
   "libavcodec/x86/hevc_sao.asm"
]
Отримав цей перелік командами:
$ find . -name 'hevc*.c' |grep -v mips| grep -v arm | grep -v template
$ find . -name 'hevc*.asm' |grep -v mips| grep -v arm
Плюс потребували у процесі компіляції додткові файли:
"libavcodec/x86/bswapdsp_init.c"
"libavcodec/bswapdsp.c"
"libavcodec/x86/bswapdsp.asm"
$ cd third_party/ffmpeg/chromium/scripts
Зміни у файлу "build_ffmpeg.py" рядок десь 553, додаю "hevc":
  # Google Chrome & ChromeOS specific configuration.
  configure_flags['Chrome'].extend([
      '--enable-decoder=aac,h264,mp3,hevc',
      '--enable-demuxer=aac,mp3,mov,hevc',
      '--enable-parser=aac,h264,mpegaudio,hevc',
  ])
За допомгою цого файлу я отримав нову конфігураційну теку з новим "ffmpeg branding" за допомогою скрипту "third_party/ffmpeg/chromium/scripts/copy_config.sh"

На основі порівнянь створив зміни у фалах:
third_party/ffmpeg/chromium/config/Chrome/linux/x64/config.h:
#define FFMPEG_CONFIGURATION .....  --enable-decoder='aac,h264,mp3,hevc' --enable-demuxer='aac,mp3,mov,hevc' --enable-parser='aac,h264,mpegaudio,hevc'
#define CONFIG_BSWAPDSP 1
#define CONFIG_HEVC_DECODER 1
#define CONFIG_HEVC_DEMUXER 1
#define CONFIG_HEVC_PARSER 1

third_party/ffmpeg/chromium/config/Chrome/linux/x64/config.h:
%define CONFIG_BSWAPDSP 1
%define CONFIG_HEVC_DECODER 1
%define CONFIG_HEVC_DEMUXER 1
%define CONFIG_HEVC_PARSER 1
Використано було FFMPEG_VERSION "git-2016-09-16-3c7a098".
Після цих змін запускаю:
$ gn args out/Default
$ ninja -C out/Default chrome

Тепер можна запускати браузер:
$ cd out/Default
$ ./chrome

PS. 2017-03-10 

1. General Chromium compile Linux (https://chromium.googlesource.com/chromium/src/+/master/docs/linux_build_instructions.md)
2. HEVC support (https://github.com/henrypp/chromium/blob/master/hevc_support.md)
3. За змінами я створив thrid_party.patch ( diff -ruN third_party-orig/ third_party/ > thrid_party.patch)
hrid_party.patch:

diff -ruN third_party-orig/ffmpeg/chromium/config/Chrome/linux/x64/config.asm third_party/ffmpeg/chromium/config/Chrome/linux/x64/config.asm
--- third_party-orig/ffmpeg/chromium/config/Chrome/linux/x64/config.asm 2017-03-09 11:44:09.000000000 -0800
+++ third_party/ffmpeg/chromium/config/Chrome/linux/x64/config.asm      2017-03-09 16:29:55.681700140 -0800
@@ -728,7 +728,7 @@
 %define CONFIG_H264_VDA_DECODER 0
 %define CONFIG_H264_VDPAU_DECODER 0
 %define CONFIG_HAP_DECODER 0
-%define CONFIG_HEVC_DECODER 0
+%define CONFIG_HEVC_DECODER 1
 %define CONFIG_HEVC_QSV_DECODER 0
 %define CONFIG_HNM4_VIDEO_DECODER 0
 %define CONFIG_HQ_HQA_DECODER 0
@@ -1204,7 +1204,7 @@
 %define CONFIG_H261_DEMUXER 0
 %define CONFIG_H263_DEMUXER 0
 %define CONFIG_H264_DEMUXER 0
-%define CONFIG_HEVC_DEMUXER 0
+%define CONFIG_HEVC_DEMUXER 1
 %define CONFIG_HLS_DEMUXER 0
 %define CONFIG_HNM_DEMUXER 0
 %define CONFIG_ICO_DEMUXER 0
@@ -2160,7 +2160,7 @@
 %define CONFIG_H261_PARSER 0
 %define CONFIG_H263_PARSER 0
 %define CONFIG_H264_PARSER 1
-%define CONFIG_HEVC_PARSER 0
+%define CONFIG_HEVC_PARSER 1
 %define CONFIG_MJPEG_PARSER 0
 %define CONFIG_MLP_PARSER 0
 %define CONFIG_MPEG4VIDEO_PARSER 0
@@ -2226,3 +2226,4 @@
 %define CONFIG_LIBRTMPTE_PROTOCOL 0
 %define CONFIG_LIBSSH_PROTOCOL 0
 %define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+%define FFMPEG_CONFIGURATION "******** --enable-decoder='hevc' --enable-demuxer='hevc' --enable-parser='hevc'"
diff -ruN third_party-orig/ffmpeg/chromium/config/Chrome/linux/x64/config.h third_party/ffmpeg/chromium/config/Chrome/linux/x64/config.h
--- third_party-orig/ffmpeg/chromium/config/Chrome/linux/x64/config.h   2017-03-09 11:44:09.000000000 -0800
+++ third_party/ffmpeg/chromium/config/Chrome/linux/x64/config.h        2017-03-09 16:32:54.625407634 -0800
@@ -744,7 +744,7 @@
 #define CONFIG_H264_VDA_DECODER 0
 #define CONFIG_H264_VDPAU_DECODER 0
 #define CONFIG_HAP_DECODER 0
-#define CONFIG_HEVC_DECODER 0
+#define CONFIG_HEVC_DECODER 1
 #define CONFIG_HEVC_QSV_DECODER 0
 #define CONFIG_HNM4_VIDEO_DECODER 0
 #define CONFIG_HQ_HQA_DECODER 0
@@ -1220,7 +1220,7 @@
 #define CONFIG_H261_DEMUXER 0
 #define CONFIG_H263_DEMUXER 0
 #define CONFIG_H264_DEMUXER 0
-#define CONFIG_HEVC_DEMUXER 0
+#define CONFIG_HEVC_DEMUXER 1
 #define CONFIG_HLS_DEMUXER 0
 #define CONFIG_HNM_DEMUXER 0
 #define CONFIG_ICO_DEMUXER 0
@@ -2176,7 +2176,7 @@ 
#define CONFIG_H261_PARSER 0
 #define CONFIG_H263_PARSER 0
 #define CONFIG_H264_PARSER 1
-#define CONFIG_HEVC_PARSER 0
+#define CONFIG_HEVC_PARSER 1
 #define CONFIG_MJPEG_PARSER 0
 #define CONFIG_MLP_PARSER 0
 #define CONFIG_MPEG4VIDEO_PARSER 0
diff -ruN third_party-orig/ffmpeg/ffmpeg_generated.gni third_party/ffmpeg/ffmpeg_generated.gni
--- third_party-orig/ffmpeg/ffmpeg_generated.gni        2017-03-09 11:44:09.000000000 -0800
+++ third_party/ffmpeg/ffmpeg_generated.gni     2017-03-09 16:17:28.463038348 -0800
@@ -660,3 +660,30 @@
   ]
 }

+ffmpeg_c_sources += [
+    "libavcodec/bswapdsp.c",
+    "libavcodec/hevc.c",
+    "libavcodec/hevc_cabac.c",
+    "libavcodec/hevc_data.c",
+    "libavcodec/hevc_filter.c",
+    "libavcodec/hevc_mvs.c",
+    "libavcodec/hevc_parse.c",
+    "libavcodec/hevc_parser.c",
+    "libavcodec/hevc_ps.c",
+    "libavcodec/hevc_refs.c",
+    "libavcodec/hevc_sei.c",
+    "libavcodec/hevcdsp.c",
+    "libavcodec/hevcpred.c",
+    "libavcodec/x86/bswapdsp_init.c",
+    "libavcodec/x86/hevcdsp_init.c",
+    "libavformat/hevcdec.c",
+]
+ffmpeg_yasm_sources += [
+    "libavcodec/x86/bswapdsp.asm",
+    "libavcodec/x86/hevc_deblock.asm",
+    "libavcodec/x86/hevc_idct.asm",
+    "libavcodec/x86/hevc_mc.asm",
+    "libavcodec/x86/hevc_res_add.asm",
+    "libavcodec/x86/hevc_sao.asm",
+    "libavcodec/x86/hevc_sao_10bit.asm",
+]
2.1 Зробимо зміни за патчем у теці third_party:
patch -p1 -i ../thrid_party.patch -d third_party

Перекомпілюємо:
ninja -C out/Default chrome

Тепер повинна бути підтримка hvec

Версія 59.0.3036.0 (Конструкція розробника) (64-розрядна версія)

Версія 59.0.3036.0 with x265 (HVEC)

Немає коментарів:


Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready