In order to build a complete ffmpeg with hardware acceleration for Intel platform (XXX lake + Atom), we need a complete Android x86 build, the cross-compilation doesn't work well with NDK or anything else.

Steps are below.


Install Ubuntu 16.04 LTS x86-64, install the all Ubuntu dependencies as here.

sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

Install Python Mako by pip, which the build system uses to generate the i18n files during compilation.

sudo apt-get install python-pip

pip install mako

Get the source code of Android x86, here make sure you have large enough space.

mkdir android-x86
cd android-x86
repo init -u git://git.osdn.net/gitroot/android-x86/manifest -b $branch
repo sync --no-tags --no-clone-bundle

The variable $branch is the name of specific Android branch.

  • oreo-x86

    • Android 8.0
  • nougat-x86
    • Android 7.1
  • marshmallow-x86
    • Android 6.0
  • lollipop-x86
    • Android 5.1
  • kitkat-x86
    • Android 4.4
  • jb-x86
    • Android 4.3
  • ics-x86
    • Android 4.0
  • honeycomb-x86
    • Android 3.2
  • gingerbread-x86
    • Android 2.3
  • froyo-x86
    • Android 2.2
  • eclair-x86
    • Android 2.1
  • donut-x86
    • Android 1.6
  • cupcake-x86 (aka android-x86-v0.9)
    • Android 1.5

Once the code base was checked out, use lunch command to build the system for once.

Enter the folder of checked out folder.

Source the build environement setup.

. build/envsetup.sh

Select the build target and type of build

lunch $TARGET_PRODUCT-$TARGET_BUILD_VARIANT

The $TARGET_PRODUCT could be one of android_x86 android_x86_64 .

The $TARGET_BUILD_VARIANT could be one of eng user userdebug .

So if we want to make a debug version of Android x86-64, we type

lunch android_x86_64-userdebug

Now type

m -jX iso_img

to make the system image.

When there is the error about org.android.analytics, open the file

./build/core/tasks/check_boot_jars/package_whitelist.txt

and append a line

org\.android_x86\.analytics

to it.

If everything goes okay, the Android system image would be build.


Now we start to build a better ffmpeg with hardware acceleration API, vaapi, cuvid etc. The system already offer the possibilty but didn't supply the correct configuration as the default.

Copy the file

external/ffmpeg/libavformat/Android.mk

to

external/ffmpeg/libavfilter

If you want to build the command line of ffmpeg, create a new Android.mk file under external/tools folder, fill it with content

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += \
-DANDROID \
-DTARGET_CONFIG=\"config-x86_64-x86_64.h\" \ LOCAL_SRC_FILES := \
../ffmpeg.c \
../ffmpeg_filter.c \
../ffmpeg_opt.c \
../ffmpeg_cuvid.c \
../ffmpeg_vaapi.c \
../cmdutils.c \ LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/android/include \
$(LOCAL_PATH)/.. \ LOCAL_SHARED_LIBRARIES := libavutil libavcodec libswscale libswresample libswscale libavformat libavfilter LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := ffmpeg include $(BUILD_EXECUTABLE)

Then that's it, you would have the ffmpeg command line under /system/bin/ffmpeg !

Do not touch the script gen-android-configs and configure with ffmpeg.

Now let's add more dependency to the system, such as libva-utils for the Intel platform to detect the video codec capability of the system.

Under the folder external, clone the repository at branch 1.8.3

git clone -b 1.8. https://github.com/intel/libva-utils.git

Enter the libva-utils folder, change a bit the source code. The system's libva under driver is 1.1.0, it's not very compatible with the libva-utils, which is a new program.

diff --git a/vainfo/vainfo.c b/vainfo/vainfo.c
index ..5d9f055
--- a/vainfo/vainfo.c
+++ b/vainfo/vainfo.c
@@ -, +, @@ int main(int argc, const char* argv[])
const char *name = strrchr(argv[], '/');
VAProfile profile, *profile_list = NULL;
int num_profiles, max_num_profiles, i;
- VAEntrypoint entrypoint, entrypoints[];
+ VAEntrypoint entrypoints[];
+ int entrypoint_index;
int num_entrypoint;
int ret_val = ; @@ -, +, @@ int main(int argc, const char* argv[])
va_status = vaInitialize(va_dpy, &major_version, &minor_version);
CHECK_VASTATUS(va_status, "vaInitialize", ); - printf("%s: VA-API version: %d.%d (libva %s)\n",
- name, major_version, minor_version, LIBVA_VERSION_S);
+ printf("%s: VA-API version: %d.%d\n",
+ name, major_version, minor_version); driver = vaQueryVendorString(va_dpy);
printf("%s: Driver version: %s\n", name, driver ? driver : "<unknown>");
@@ -, +, @@ int main(int argc, const char* argv[])
CHECK_VASTATUS(va_status, "vaQueryConfigEntrypoints", ); profile_str = profile_string(profile);
- for (entrypoint = ; entrypoint < num_entrypoint; entrypoint++)
- printf(" %-32s: %s\n", profile_str, entrypoint_string(entrypoints[entrypoint]));
+ for (entrypoint_index = ; entrypoint_index < num_entrypoint; entrypoint_index++)
+ printf(" %-32s: %s\n", profile_str, entrypoint_string(entrypoints[entrypoint_index]));

Just make the vainfo.c is able to be compiled with system libva.

Back to the folder android-x86, type

mmm external/libva-utils

to just build the specific module. That's it, now the /system/bin/vainfo would be there !


References

  • http://www.android-x86.org/getsourcecode
  • https://github.com/CyanogenMod/android_external_ffmpeg
  • https://github.com/intel/libva
  • https://github.com/intel/libva-utils

How to build ffmpeg with hardware accelerated codecs for Android x86的更多相关文章

  1. How to Build FFmpeg for Android

    http://www.roman10.net/how-to-build-ffmpeg-for-android/ ffmpeg is an open-source platform for record ...

  2. 硬件加速 Hardware Accelerated 绘制

    官方文档中对硬件加速的描述 原文地址:http://developer.android.com/guide/topics/graphics/hardware-accel.html Beginning ...

  3. Build FFmpeg for iOS

    FFmpeg Build Instructions MAC 10.8 or better Copy ffmpeg-2.0.tar.bz2 (https://ffmpeg.org/releases/ff ...

  4. CSS开启硬件加速 hardware accelerated

    作者:孙志勇 微博 日期:2016年12月6日 一.时效性 所有信息都具有时效性.文章的价值,往往跟时间有很大关联.特别是技术类文章,请注意本文创建时间,如果本文过于久远,请读者酌情考量,莫要浪费时间 ...

  5. VS 的编译选项 build下的 platform target -- Any CPU和x86有什么影响?

    VS 的编译选项 build下的platform -- Any CPU和x86有什么影响? 现在的问题是,我的一个assembly用Any CPU编译就不能在64位系统下运行了,但是用x86编译就ok ...

  6. Using Qt to build an Omi App for iOS (and Android)

    JUNE 6, 2014 / HHARTZ Working on projects where the technology is pre-determined, it's often difficu ...

  7. ffmpeg学习笔记-Linux下编译Android动态库

    Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库 文件准备 要编译生成Android需要以下文件 NDK ffmpeg源代码 NDK下载 NDK可 ...

  8. 最简单的基于FFmpeg的移动端例子:Android 视频转码器

    http://blog.csdn.net/leixiaohua1020/article/details/47056365

  9. (转载)中文Appium API 文档

    该文档是Testerhome官方翻译的源地址:https://github.com/appium/appium/tree/master/docs/cn官方网站上的:http://appium.io/s ...

随机推荐

  1. 什么是分布式锁及正确使用redis实现分布式锁

    分布式锁 分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性. 举个不太恰当的例子:假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人,分布式锁 ...

  2. 微信小程序开发库grace vs wepy

    grace和wepy都是辅助小程序开发的开源库,本文对两者做个对比. 注:本文是作者本人的一些拙见,纯粹的技术讨论,不想引起技术信仰之争,欢迎积极.正向的讨论及建议. 如果你还不了解Grace, 请参 ...

  3. http://www.runoob.com/lua/lua-basic-syntax.html

    Lua优点及特性 Lua 是一个小巧的脚本语言. 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行.Lua并没 ...

  4. PiggyMetrics windows 部署

    PiggyMetrics 是springcloud的demo,其特性就不细说了,主要描述在win10下部署的坑. 官网是:https://github.com/sqshq/PiggyMetrics 官 ...

  5. 【一通百通】Bash的单双括号建议:多用[[]], 少用[]

    一. bash [  ] 单双括号 基本要素: Ø  [ ] 两个符号左右都要有空格分隔 Ø  内部操作符与操作变量之间要有空格:如  [  “a”  =  “b”  ] Ø  字符串比较中,> ...

  6. jQuery中 $.ajax()方法详解

    $.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Strin ...

  7. angularJS--多个控制器之间的数据共享

    为了在控制器之间共享数据,需要在服务中添加一个用来储存用户名的方法.记住,服务在 应用的生命周期内是单例模式的,因此可以将用户名安全地储存在其中. <!DOCTYPE html> < ...

  8. Python爬虫-pyspider框架的使用

      pyspider 是一个用python实现的功能强大的网络爬虫系统,能在浏览器界面上进行脚本的编写,功能的调度和爬取结果的实时查看,后端使用常用的数据库进行爬取结果的存储,还能定时设置任务与任务优 ...

  9. 一次完整的HTTP网络请求过程详解

    0.  前言 从我们在浏览器的地址栏输入http://blog.csdn.net/seu_calvin后回车,到我们看到该博客的主页,这中间经历了什么呢?简单地回答这个问题,大概是经历了域名解析.TC ...

  10. 一步一步理解 python web 框架,才不会从入门到放弃

    要想清楚地理解 python web 框架,首先要清楚浏览器访问服务器的过程. 用户通过浏览器浏览网站的过程: 用户浏览器(socket客户端) 3. 客户端往服务端发消息 6. 客户端接收消息 7. ...