[FFmpeg-devel] [PATCH v2 0/7] HEVC native support for Screen content coding

Mark Thompson sw at jkqxz.net
Tue Sep 29 16:56:25 EEST 2020


On 10/09/2020 07:42, Haihao Xiang wrote:
> Resend Linjie's patchset with the updates.
> 
> As a part of the support for VA-API HEVC SCC decoding (gen12, Tiger
> Lake+).
> 
> The full support could be accessed in:
> https://github.com/intel-media-ci/ffmpeg/pull/231
> 
> The VAAPI part would be provided later once the implementations of
> native parsing and reference management are all decent.
> 
> Linjie Fu (7):
>    lavc/avcodec: Add FF_PROFILE_HEVC_SCC for screen content coding
>    lavc/hevc_ps: Add sps parse support for HEVC SCC extension syntax
>    lavc/hevc_ps: Add pps parse support for HEVC SCC extension
>    lavc/hevc_ps: Add slice parse support for HEVC SCC extension
>    lavc/hevcdec: Fix the parsing for use_integer_mv_flag
>    lavc/hevcdec: Set max_num_merge_cand to uint8_t
>    lavc/hevc: Update reference list for SCC
> 
>   libavcodec/avcodec.h   |   1 +
>   libavcodec/hevc.h      |   3 ++
>   libavcodec/hevc_ps.c   | 118 +++++++++++++++++++++++++++++++++++++++--
>   libavcodec/hevc_ps.h   |  32 +++++++++++
>   libavcodec/hevc_refs.c |  27 +++++++++-
>   libavcodec/hevcdec.c   |  17 +++++-
>   libavcodec/hevcdec.h   |   7 ++-
>   libavcodec/profiles.c  |   1 +
>   8 files changed, 197 insertions(+), 9 deletions(-)

This looks generally pretty good, but the lack of a software implementation is kindof unfortunate - is there any plan to do anything about that?

If not, I think you need to make sure that all of the newly-added flags give a suitable error message to say that it isn't supported.  (Especially in cases like use_integer_mv_flag where it can return incorrect output while saying that everything is fine.)


It seems to always hang with all threads waiting for each other when given a non-software-decodable SCC stream with threads enabled (it hangs forever entirely repeatably before the SIGINT):

$ ./ffmpeg_g -threads 2 -i PPI_A_InterDigital_2.bit -f null -
...
     Stream #0:0: Video: hevc (Scc), yuv444p(tv), 1280x720, 25 fps, 25 tbr, 1200k tbn, 25 tbc
[hevc @ 0x555557b3a680] high_precision_offsets_enabled_flag not yet implemented
[hevc @ 0x555557b3a680] Overread PPS by 8 bits
[New Thread 0x7ffff344f700 (LWP 1954956)]
[New Thread 0x7ffff2c4e700 (LWP 1954957)]
Stream mapping:

   Stream #0:0 -> #0:0 (hevc (native) -> wrapped_avframe (native))
Press [q] to stop, [?] for help
[hevc @ 0x555557b3a680] high_precision_offsets_enabled_flag not yet implemented
[hevc @ 0x555557b3a680] Overread PPS by 8 bits
[hevc @ 0x555557b3a680] PPS id out of range: 0
[hevc @ 0x555557b3a680] Error parsing NAL unit #3.
Error while decoding stream #0:0: Invalid data found when processing input

Thread 1 "ffmpeg_g" received signal SIGINT, Interrupt.
futex_wait_cancelable (private=0, expected=0, futex_word=0x555557b4cd90) at ../sysdeps/nptl/futex-internal.h:183
183     ../sysdeps/nptl/futex-internal.h: No such file or directory.
(gdb) i thr
   Id   Target Id                                      Frame
* 1    Thread 0x7ffff34561c0 (LWP 1954952) "ffmpeg_g" futex_wait_cancelable (private=0, expected=0, futex_word=0x555557b4cd90) at ../sysdeps/nptl/futex-internal.h:183
   2    Thread 0x7ffff344f700 (LWP 1954956) "ffmpeg_g" futex_wait_cancelable (private=0, expected=0, futex_word=0x555557b4cb80) at ../sysdeps/nptl/futex-internal.h:183
   3    Thread 0x7ffff2c4e700 (LWP 1954957) "ffmpeg_g" futex_wait_cancelable (private=0, expected=0, futex_word=0x555557b4cd64) at ../sysdeps/nptl/futex-internal.h:183
(gdb) thr ap al bt

Thread 3 (Thread 0x7ffff2c4e700 (LWP 1954957)):
#0  futex_wait_cancelable (private=0, expected=0, futex_word=0x555557b4cd64) at ../sysdeps/nptl/futex-internal.h:183
#1  __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x555557b4cdc0, cond=0x555557b4cd38) at pthread_cond_wait.c:508
#2  __pthread_cond_wait (cond=0x555557b4cd38, mutex=0x555557b4cdc0) at pthread_cond_wait.c:638
#3  0x00005555560eaed8 in strict_pthread_cond_wait (cond=0x555557b4cd38, mutex=0x555557b4cdc0) at src/libavutil/thread.h:112
#4  0x00005555560ec49c in ff_thread_await_progress (f=0x555557b6b0a8, n=41, field=0) at src/libavcodec/pthread_frame.c:601
#5  0x0000555555e8e73b in hevc_await_progress (s=0x555557b6a140, ref=0x555557b6b0a0, mv=0x7ffff2c4da00, y0=0, height=32) at src/libavcodec/hevcdec.c:1796
#6  0x0000555555e8eeb3 in hls_prediction_unit (s=0x555557b6a140, x0=32, y0=0, nPbW=32, nPbH=32, log2_cb_size=5, partIdx=0, idx=3) at src/libavcodec/hevcdec.c:1900
#7  0x0000555555e902f5 in hls_coding_unit (s=0x555557b6a140, x0=32, y0=0, log2_cb_size=5) at src/libavcodec/hevcdec.c:2206
#8  0x0000555555e9114c in hls_coding_quadtree (s=0x555557b6a140, x0=32, y0=0, log2_cb_size=5, cb_depth=1) at src/libavcodec/hevcdec.c:2388
#9  0x0000555555e90fce in hls_coding_quadtree (s=0x555557b6a140, x0=0, y0=0, log2_cb_size=6, cb_depth=0) at src/libavcodec/hevcdec.c:2362
#10 0x0000555555e91bc4 in hls_decode_entry (avctxt=0x555557b77580, isFilterThread=0x7ffff2c4dce8) at src/libavcodec/hevcdec.c:2498
#11 0x00005555562059d3 in avcodec_default_execute (c=0x555557b77580, func=0x555555e9188d <hls_decode_entry>, arg=0x7ffff2c4dce8, ret=0x7ffff2c4dce0, count=1, size=4) at src/libavcodec/utils.c:448
#12 0x0000555555e91ce2 in hls_slice_data (s=0x555557b6a140) at src/libavcodec/hevcdec.c:2525
#13 0x0000555555e93f5b in decode_nal_unit (s=0x555557b6a140, nal=0x7fffe4006470) at src/libavcodec/hevcdec.c:3098
#14 0x0000555555e9428d in decode_nal_units (s=0x555557b6a140, buf=0x555557b85590 "", length=12760) at src/libavcodec/hevcdec.c:3171
#15 0x0000555555e948a0 in hevc_decode_frame (avctx=0x555557b77580, data=0x555557b4a9c0, got_output=0x555557b4ce50, avpkt=0x555557b4cdf0) at src/libavcodec/hevcdec.c:3314
#16 0x00005555560eb205 in frame_worker_thread (arg=0x555557b4ccf0) at src/libavcodec/pthread_frame.c:201
#17 0x00007ffff6d25ea7 in start_thread (arg=<optimized out>) at pthread_create.c:477
#18 0x00007ffff4ad7eaf in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Thread 2 (Thread 0x7ffff344f700 (LWP 1954956)):
#0  futex_wait_cancelable (private=0, expected=0, futex_word=0x555557b4cb80) at ../sysdeps/nptl/futex-internal.h:183
#1  __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x555557b4cbe8, cond=0x555557b4cb58) at pthread_cond_wait.c:508
#2  __pthread_cond_wait (cond=0x555557b4cb58, mutex=0x555557b4cbe8) at pthread_cond_wait.c:638
#3  0x00005555560eaed8 in strict_pthread_cond_wait (cond=0x555557b4cb58, mutex=0x555557b4cbe8) at src/libavutil/thread.h:112
#4  0x00005555560eb0bf in frame_worker_thread (arg=0x555557b4cb40) at src/libavcodec/pthread_frame.c:177
#5  0x00007ffff6d25ea7 in start_thread (arg=<optimized out>) at pthread_create.c:477
#6  0x00007ffff4ad7eaf in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Thread 1 (Thread 0x7ffff34561c0 (LWP 1954952)):
#0  futex_wait_cancelable (private=0, expected=0, futex_word=0x555557b4cd90) at ../sysdeps/nptl/futex-internal.h:183
#1  __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x555557b4cdc0, cond=0x555557b4cd68) at pthread_cond_wait.c:508
#2  __pthread_cond_wait (cond=0x555557b4cd68, mutex=0x555557b4cdc0) at pthread_cond_wait.c:638
#3  0x00005555560eaed8 in strict_pthread_cond_wait (cond=0x555557b4cd68, mutex=0x555557b4cdc0) at src/libavutil/thread.h:112
#4  0x00005555560ec0ef in ff_thread_decode_frame (avctx=0x555557b39840, picture=0x555557b39d80, got_picture_ptr=0x7fffffffd5e4, avpkt=0x555557b39600) at src/libavcodec/pthread_frame.c:526
#5  0x0000555555d884f6 in decode_simple_internal (avctx=0x555557b39840, frame=0x555557b39d80) at src/libavcodec/decode.c:350
#6  0x0000555555d89132 in decode_simple_receive_frame (avctx=0x555557b39840, frame=0x555557b39d80) at src/libavcodec/decode.c:549
#7  0x0000555555d89218 in decode_receive_frame_internal (avctx=0x555557b39840, frame=0x555557b39d80) at src/libavcodec/decode.c:569
#8  0x0000555555d89475 in avcodec_send_packet (avctx=0x555557b39840, avpkt=0x7fffffffd7f0) at src/libavcodec/decode.c:627
#9  0x0000555555695517 in decode (avctx=0x555557b39840, frame=0x555557b61d80, got_frame=0x7fffffffd964, pkt=0x7fffffffd7f0) at src/fftools/ffmpeg.c:2218
#10 0x0000555555695d86 in decode_video (ist=0x555557b34f40, pkt=0x7fffffffd970, got_output=0x7fffffffd964, duration_pts=0x7fffffffd968, eof=0, decode_failed=0x7fffffffd960) at src/fftools/ffmpeg.c:2360
#11 0x0000555555696d79 in process_input_packet (ist=0x555557b34f40, pkt=0x7fffffffdc40, no_eof=0) at src/fftools/ffmpeg.c:2601
#12 0x000055555569e06f in process_input (file_index=0) at src/fftools/ffmpeg.c:4494
#13 0x000055555569e594 in transcode_step () at src/fftools/ffmpeg.c:4614
#14 0x000055555569e6be in transcode () at src/fftools/ffmpeg.c:4668
#15 0x000055555569ef4b in main (argc=8, argv=0x7fffffffe3b8) at src/fftools/ffmpeg.c:4873
(gdb)

That PPS overread looks like something which shouldn't happen, too.

- Mark


More information about the ffmpeg-devel mailing list