TransWikia.com

Raspberry pi 4 - Hardware offload of h264 video decoding in Chromium

Raspberry Pi Asked by RomD on November 11, 2021

I am trying to develop a web application displayed in chromium in kiosk mod (78.0.3904.108 (Official Build) Built on Raspbian , running on Raspbian 10 (32-bit)).
I am hoping to play h264 medias fluidly and for this, I am trying to use the raspberry pi hardware to decode the videos.

I have followed the advices from this thread Framerate drop with video on chromium browser in order to have this result (chrome://gpu):


Graphics Feature Status
Canvas: Hardware accelerated
Flash: Hardware accelerated
Flash Stage3D: Hardware accelerated
Flash Stage3D Baseline profile: Hardware accelerated
Compositing: Hardware accelerated
Multiple Raster Threads: Enabled
Out-of-process Rasterization: Disabled
Hardware Protected Video Decode: Hardware accelerated
Rasterization: Hardware accelerated
Skia Renderer: Disabled
Video Decode: Hardware accelerated
Viz Display Compositor: Enabled
Viz Hit-test Surface Layer: Disabled
WebGL: Hardware accelerated
WebGL2: Hardware accelerated
Driver Bug Workarounds
clear_uniforms_before_first_program_use
count_all_in_varyings_packing
exit_on_context_lost
rely_on_implicit_sync_for_swap_buffers
scalarize_vec_and_mat_constructor_args
disabled_extension_GL_KHR_blend_equation_advanced
disabled_extension_GL_KHR_blend_equation_advanced_coherent
Problems Detected
Clear uniforms before first program use on all platforms: 124764, 349137
Applied Workarounds: clear_uniforms_before_first_program_use
Mesa drivers in Linux handle varyings without static use incorrectly: 333885
Applied Workarounds: count_all_in_varyings_packing
Always rewrite vec/mat constructors to be consistent: 398694
Applied Workarounds: scalarize_vec_and_mat_constructor_args
Disable KHR_blend_equation_advanced until cc shaders are updated: 661715
Applied Workarounds: disable(GL_KHR_blend_equation_advanced), disable(GL_KHR_blend_equation_advanced_coherent)
Some drivers can't recover after OUT_OF_MEM and context lost: 893177
Applied Workarounds: exit_on_context_lost
Avoid waiting on a egl fence before swapping buffers and rely on implicit sync on Broadcom GPUs: 938286
Applied Workarounds: rely_on_implicit_sync_for_swap_buffers
Version Information
Data exported   2020-07-21T15:40:59.677Z
Chrome version  Chrome/78.0.3904.108
Operating system    Linux 4.19.118-v7l+
Software rendering list URL https://chromium.googlesource.com/chromium/src/+/4b26898a39ee037623a72fcfb77279fce0e7d648/gpu/config/software_rendering_list.json
Driver bug list URL https://chromium.googlesource.com/chromium/src/+/4b26898a39ee037623a72fcfb77279fce0e7d648/gpu/config/gpu_driver_bug_list.json
ANGLE commit id unknown hash
2D graphics backend Skia/78 dba5c993df3fb95fed01f8131aa0401e83c9198f
Command Line    /usr/lib/chromium-browser/chromium-browser-v7 --disable-quic --enable-tcp-fast-open --ppapi-flash-path=/usr/lib/chromium-browser/libpepflashplayer.so --ppapi-flash-args=enable_stagevideo_auto=0 --ppapi-flash-version=32.0.0.403 --enable-pinch --noerrdialogs --use-gl=egl --enable-gpu-rasterization --enable-native-gpu-memory-buffers --ignore-gpu-blacklist --disable-infobars --autoplay-policy=no-user-gesture-required --check-for-update-interval=31536000 --disable-component-update --flag-switches-begin --flag-switches-end http://localhost/
Driver Information
Initialization time 871
In-process GPU  false
Passthrough Command Decoder false
Sandboxed   true
GPU0    VENDOR = 0x0000 [Broadcom], DEVICE= 0x0000 [V3D 4.2] *ACTIVE*
Optimus false
AMD switchable  false
Driver vendor   Mesa
Driver version  19.3.2
GPU CUDA compute capability major version   0
Pixel shader version    3.10
Vertex shader version   3.10
Max. MSAA samples   4
Machine model name  
Machine model version   
GL_VENDOR   Broadcom
GL_RENDERER V3D 4.2
GL_VERSION  OpenGL ES 3.1 Mesa 19.3.2
GL_EXTENSIONS   GL_EXT_blend_minmax GL_EXT_multi_draw_arrays GL_EXT_texture_format_BGRA8888 GL_OES_compressed_ETC1_RGB8_texture GL_OES_depth24 GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_mapbuffer GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_stencil8 GL_OES_texture_3D GL_OES_texture_float GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_vertex_half_float GL_EXT_texture_sRGB_decode GL_OES_EGL_image GL_OES_depth_texture GL_OES_packed_depth_stencil GL_EXT_texture_type_2_10_10_10_REV GL_OES_get_program_binary GL_APPLE_texture_max_level GL_EXT_discard_framebuffer GL_EXT_read_format_bgra GL_EXT_frag_depth GL_NV_fbo_color_attachments GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_array_object GL_EXT_occlusion_query_boolean GL_EXT_texture_rg GL_EXT_unpack_subimage GL_NV_draw_buffers GL_NV_read_buffer GL_NV_read_depth GL_NV_read_depth_stencil GL_NV_read_stencil GL_EXT_draw_buffers GL_EXT_map_buffer_range GL_KHR_debug GL_KHR_texture_compression_astc_ldr GL_OES_depth_texture_cube_map GL_OES_required_internalformat GL_OES_surfaceless_context GL_EXT_color_buffer_float GL_EXT_sRGB_write_control GL_EXT_separate_shader_objects GL_EXT_shader_implicit_conversions GL_EXT_shader_integer_mix GL_EXT_base_instance GL_EXT_compressed_ETC1_RGB8_sub_texture GL_EXT_draw_elements_base_vertex GL_EXT_primitive_bounding_box GL_EXT_shader_io_blocks GL_EXT_texture_border_clamp GL_EXT_texture_norm16 GL_KHR_context_flush_control GL_NV_image_formats GL_OES_draw_elements_base_vertex GL_OES_primitive_bounding_box GL_OES_shader_io_blocks GL_OES_texture_border_clamp GL_OES_texture_stencil8 GL_OES_texture_storage_multisample_2d_array GL_EXT_buffer_storage GL_EXT_float_blend GL_KHR_no_error GL_KHR_texture_compression_astc_sliced_3d GL_OES_EGL_image_external_essl3 GL_OES_shader_image_atomic GL_MESA_shader_integer_functions GL_KHR_parallel_shader_compile GL_MESA_framebuffer_flip_y GL_EXT_texture_query_lod
Disabled Extensions GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent
Disabled WebGL Extensions   
Window system binding vendor    Mesa Project
Window system binding version   1.4
Window system binding extensions    EGL_ANDROID_blob_cache EGL_CHROMIUM_sync_control EGL_EXT_buffer_age EGL_EXT_image_dma_buf_import EGL_EXT_image_dma_buf_import_modifiers EGL_KHR_cl_event2 EGL_KHR_config_attribs EGL_KHR_create_context EGL_KHR_create_context_no_error EGL_KHR_fence_sync EGL_KHR_get_all_proc_addresses EGL_KHR_gl_colorspace EGL_KHR_gl_renderbuffer_image EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_3D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_no_config_context EGL_KHR_reusable_sync EGL_KHR_surfaceless_context EGL_EXT_pixel_format_float EGL_KHR_wait_sync EGL_MESA_configless_context EGL_MESA_drm_image EGL_MESA_image_dma_buf_export EGL_MESA_query_driver EGL_NOK_texture_from_pixmap
Window manager  Openbox
Compositing manager No
Direct rendering version    unknown
Reset notification strategy 0x0000
GPU process crash count 0
System visual ID    0
RGBA visual ID  0
gfx::BufferFormats supported for allocation and texturing   R_8: not supported, R_16: not supported, RG_88: not supported, BGR_565: not supported, RGBA_4444: not supported, RGBX_8888: not supported, RGBA_8888: not supported, BGRX_8888: not supported, BGRX_1010102: not supported, RGBX_1010102: not supported, BGRA_8888: not supported, RGBA_F16: not supported, YVU_420: not supported, YUV_420_BIPLANAR: not supported, P010: not supported
Compositor Information
Tile Update Mode    One-copy
Partial Raster  Enabled
GpuMemoryBuffers Status
R_8 Software only
R_16    Software only
RG_88   Software only
BGR_565 Software only
RGBA_4444   Software only
RGBX_8888   Software only
RGBA_8888   Software only
BGRX_8888   Software only
BGRX_1010102    Software only
RGBX_1010102    Software only
BGRA_8888   Software only
RGBA_F16    Software only
YVU_420 GPU_READ, SCANOUT, SCANOUT_CPU_READ_WRITE, GPU_READ_CPU_READ_WRITE
YUV_420_BIPLANAR    GPU_READ, SCANOUT, SCANOUT_CPU_READ_WRITE, GPU_READ_CPU_READ_WRITE
P010    Software only
Display(s) Information
Info    Display[10922429375651648] bounds=[0,0 1920x1080], workarea=[0,36 1920x1044], scale=1, external.
Color space information {primaries:INVALID, transfer:INVALID, matrix:INVALID, range:INVALID}
SDR white level in nits 80
Bits per color component    8
Bits per pixel  24
Refresh Rate in Hz  60
Video Acceleration Information
Log Messages
[1196:1196:0721/164245.807341:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 1 times!
[1196:1196:0721/164245.812865:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 2 times!
[1196:1196:0721/164543.018328:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 3 times!
[1196:1196:0721/164605.274518:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 4 times!
[1196:1196:0721/164630.301006:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 5 times!
[1196:1196:0721/164630.301923:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 6 times!
[1196:1196:0721/164646.911334:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 7 times!
[1196:1196:0721/164656.154995:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 8 times!
[1196:1196:0721/171254.385879:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 9 times!
[1196:1196:0721/171254.389274:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 10 times!
[1196:1196:0721/171322.819071:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 11 times!
[1196:1196:0721/171322.822810:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 12 times!
[1196:1196:0721/171422.966595:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 13 times!
[1196:1196:0721/171539.840234:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 14 times!
[1196:1196:0721/171539.849224:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 15 times!
[1196:1196:0721/171555.001696:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 16 times!
[1196:1196:0721/171625.507088:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 17 times!
[1196:1196:0721/171625.517693:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 18 times!
[1196:1196:0721/171640.858668:ERROR:gl_surface_presentation_helper.cc(259)] : GetVSyncParametersIfAvailable() failed for 19 times!
[1196:1289:0721/173443.320040:INFO:shared_image_x11.cc(266)] : SHM version 1.2: OK
[1196:1289:0721/173945.449819:INFO:surface.cc(662)] : No surface_client_
[1196:1289:0721/173946.163938:INFO:surface.cc(662)] : No surface_client_
[1196:1289:0721/173946.813720:INFO:surface.cc(662)] : No surface_client_
[1196:1289:0721/173949.103396:INFO:surface.cc(662)] : No surface_client_
[1196:1289:0721/173950.249899:INFO:surface.cc(662)] : No surface_client_
[1196:1289:0721/173952.082303:INFO:surface.cc(662)] : No surface_client_
[1196:1289:0721/173952.714649:INFO:surface.cc(662)] : No surface_client_
[1196:1289:0721/174010.409417:INFO:surface.cc(662)] : No surface_client_
[1196:1289:0721/174059.569617:INFO:surface.cc(662)] : No surface_client_

But unfortunately, the CPU is still high and I think the quality isn’t perfect yet:
HTOP CPU RPI4

Is there a way to verify if the medias are decoded by the hardware ?

EDIT 1 (thanks for the first comment)

After checking the raspbian forum, I found out that there are in fact two versions of chromium:

  • One compiled by the RPI Team which is an old version (v78)
  • One compiled officially which is today at version 83

The first one is normally optimized for RPI but, as my first post shows it, it’s not working for me. The second one isn’t optimized for RPI and is only software decoding capable (but it seems there was a huge improvement since chromium v82 release). I tested it and for the moment, the media quality is better but it’s sometimes crashing/freezing.

I didn’t find an another web-browser for raspbian which can be lighter yet performant (it seems firefox is progressing) and I wasn’t successful at compiling chromium since raspbian isn’t in the list of compatible OS.

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP