Tutorial: How to implement H.265/HEVC for Intel Atom Based Android Platforms

Updated on 27-Oct-2014
HIGHLIGHTS

This tutorial introduces Strongene's H.265/HEVC solution on Intel Atom processor-based Android tablets and also gives you a tutorial on how to implement the H.265/HEVC compression

The H.265/HEVC standard is becoming more and more popular in the mobile market. Online video providers, mobile Internet users, and broadcast/TV operators are the beneficiaries of this new video revolution, along with users. To produce the results described in this article, Strongene's H.265/HEVC solutions were fully optimized for Intel® Atom™ processor-based Android platforms, so don't hesitate to adopt their solutions to develop HEVC players.

Strongene's H.265/HEVC Solution

To evaluate a good video standard, we generally use efficiency and compatibility standards. The video standard evolution over the past 20 years is shown in the following graph:

Figure1. Video standard history

H.265/HEVC is the successor codec to H.264/AVC (Advanced Video Coding), both were developed jointly by the ISO/IEC Moving Picture Experts Group [4] and ITU-T Video Coding Experts Group (VCEG) [5]. The primary goal of the new codec is to provide 50% better compression efficiency than H.264 and support resolutions up to 8192 x 4320.

As shown in Figure 1, it took 9 years to evolve from MPEG-2 to H.264/AVC, so more challenges are expected to be encountered in moving from the H.264/AVC standard to the H.265/HEVC standard. Gaps between the technical concept and the actual quality of the product still exist for H.265/HEVC. However, H.265/HEVC does a good job of balancing the efficiency and compatibility requirements, which make up the next level of video standards.

Strongene's H.265/HEVC solutions were optimized using YASM [6] assembler compiler, Intel® C++ Compiler[7], Intel® Streaming SIMD Extensions (Intel® SSE) [8], and Intel® Threading Building Blocks (Intel® TBB) [9], with OpenGL* [10] used for rendering. By directly uploading the decoded YUV420 data to the GPU, it finishes the transcoding of YUV data to RGB data and renders the RGB data to LCD. This reduces the CPU's workload and improves performance. The data stream is shown in the following diagram:

Figure2. Render method comparison

On an Intel Atom processor-based tablet (codenamed Bay Trail), after having been tested by Intel® Graphics Performance Analyzers (Intel® GPA) [11] tool, the optimized H.265/HEVC decoder refresh rate can reach 90 FPS (frames per second) when playing a 1080p HEVC video. If we set the refresh rate to 24 FPS on the Bay Trail tablet when playing the 1080p video, the CPU workload is less than 25%. Thus, Strongene's H.265/HEVC solution achieves commercial use capability.

Analysis of the APIs of Strongene's H.265/HEVC Solution

The APIs of Strongene's H.265/HEVC solution are easily used directly with or integrated into FFmpeg open source. Strongene defined five functions and one structure for the H.265/HEVC decoder, as listed below:

Structure:

lenthevcdec_ctx;

Description: It is the context of decoder for identifying different decoders.

Functions:
1. Unit32_t lenthevcdec_version(void);

Description: For getting API version of current library.

2. lenthevcdec_ctx lenthevcdec_create(int threads, int comoatibility, void* reserved);

Description: Create decoder with specified parameters.

Example:

 
1 lenthevcdec_ctx ctx;
2 ctx = lenthevcdec_create(2, 0x7fffffff, NULL);
3 if ( NULL == ctx ) {
4 fprintf(stderr, "call lenthevcdec_create failed!n");
5 exit(1);}

3. Void lenthevcdec_destroy(lenthevcdec_ctx ctx);
Description: Close decoder and release any resources.

4. Void lenthevcdec_flush(lenthevcdec_ctx ctx);
Description: flush decoder and clean the buffer.

5. int LENTAPI lenthevcdec_decode_frame( lenthevcdec_ctx ctx, const void* bs, intbs_len, int64_tpts, int* got_frame, int* width, int* height, intline_stride[3], void* pixels[3], int64_t* got_pts);

Description: Decode one frame. Input one frame's bit stream to decoder, and get one frame's pixel data from decoder if any frame has been decoded.

Example:

 
01 int32_t got_frame, width, height, stride[3], ret, i;
02 uint8_t* pixels[3];
03 int64_tpts, got_pts;
04 for ( i = 0; i <au_count; i++ ) {
05 pts = i * 40;
06 got_frame = 0;
07 ret = lenthevcdec_decode_frame(ctx, au_buf + au_pos[i], au_pos[i + 1] -
08 au_pos[i], pts,&got_frame, &width, &height, stride, (void**)pixels,
09 &got_pts);
10 if ( ret < 0 ) {
11 fprintf(stderr,
12 "calllenthevcdec_decode_frame failed! ret=%dn", ret);
13 exit(1);
14 }
15 if ( got_frame> 0 ) {
16 printf("decode frame, %dx%d, pts is %" PRId64 "n",
17 width, height, got_pts);
18 /* got frame, do something ... */
19 }
20 }

How to Integrate Strongene's H.265/HEVC Solution

Developers can easily integrate these five functions when developing HEVC video players. The documentation and sample code are available from Strongene's download web site [12].

Developers can directly call the Strongene's H.265/HEVC APIs to develop their video players, or they can merge Strongene's H.265/HEVC patch for FFmpeg, and then use the merged FFmpeg APIs to develop their video players. The following paragraph introduces the two methods separately.

Directly Use Strongene's APIs to Develop Video Players

On Strongene's web site, developers can download the:

  • sample code testdec.c/lenthevcdec.h
  • decoder: liblenthevcdec.so
  • documents: lenthevcdec_en.pdf, the Makefile

Copy the sample code to Ubuntu* build machine into separate folders:

wangsy@ubuntu:~/Desktop cp testdec.c Makefille ~/hevc/srcwangsy@ubuntu:~/Desktop cp lenthevcdec.h  ~/hevc/includewangsy@ubuntu:~/Desktop cp liblenthevcdec.so ~/hevc/lib/Android_x86

Set up ANDROID_NDK_HOME environment with the "export" command:

export ANDROID_NDK_HOME= $ ANDROID_NDK_HOME :/~/android-ndk-r9c

Then run the "make" command.

Then build the sample code and get the output file testdec. Copy the output file and the decoder libs into the root Android devices under /data/hevc_test.

Set up LD_LIBRARY_PATH environment with the "export" command:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/hevc_test

Then you can run the demo on the Android devices directly.

Use the H.265/HEVC Patch for FFmpeg to Develop the Video Players

In fact, most developers will use the open source FFmpeg to develop their video players. Strongene's web site also provides the patch for FFmpeg, which can be downloaded from:lentoid_ffmpeg2.0_patch_2014_01_23_new_encoder_interface.patch

To merge this patch, you should also download and decompress the FFmpeg 2.0.4 version [13]. Then add the patch:

wangsy@ubuntu:~/ffmpeg-2.0.4patch –p1 < ./lentoid_ffmpeg2.0_patch_2014_01_23_new_encoder_interface.patch

Copy the downloaded headfile and the libs code to ~/ffmpeg-2.0.4/thirdparty

cp lenthevcdec.h lenthevcenc.h liblenthevcdec.so liblenthevcenc.so ~/ffmpeg-2.0.4/thirdparty

Copy the following configure file to ~/ffmpeg-2.0.4 and add the "run" permissions:

wangsy@ubuntu: cp build_x86.sh ~/ffmpeg-2.0.4wangsy@ubuntu: sudo chmod a+x ~/ffmpeg-2.0.4/build_x86.sh

Download build_x86.txt

Run the configure file "build_x86.sh" (embedded above), then run the "make" and "make install" commands. The merged FFmpeg with Strongene's H.265/HEVC patch should now be built successfully. The output libs will be under~/FFmpeg2.0.4/android/x86/lib. You can use these output libs in your video players.

 

For more such Android resources and tools from Intel, please visit the Intel® Developer Zone

Connect On :