[FFmpeg-devel] h264_slice: Copy the value of x264_build before calling h264_slice_header_init during thread init

Submitted by Derek Buitenhuis on Oct. 8, 2018, 3:36 p.m.

Details

Message ID 20181008153627.22264-1-derek.buitenhuis@gmail.com
State New
Headers show

Commit Message

Derek Buitenhuis Oct. 8, 2018, 3:36 p.m.
If we don't copy this value first, it is seen as 0 by h264_slice_header_init,
due to zero-allocation of the new context, triggering an old hack that
multiplied the denominator by 2 for files produced by old x264 versions, but
only if more than one thread was used.

Fixes #7475.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
---
 libavcodec/h264_slice.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

James Almer Oct. 8, 2018, 6:49 p.m.
On 10/8/2018 3:45 PM, Derek Buitenhuis wrote:
> On 08/10/2018 19:23, Carl Eugen Hoyos wrote:
>> I cannot reproduce ticket #7475 (it says "framerate num 30 den 1"
>> no matter how many threads I use, tested with up to 8), and - more
>> related to this patch - the sample from ticket #7475 reaches neither
>> line 358 nor line 400 in h264_slice.c here when running the command
>> shown in the ticket.
>>
>> $ md5sum crew_cif_timecode-2.h264
>> 43fbbb4ead1af31ed19dbb6582761d73  crew_cif_timecode-2.h264
>>
>> Do you know what I am doing wrong?
> 
> Your MD5 matches mine. 
> 
> Running on Linux (vanilla Debian unstable), using the patch from the trac entry:
>     $ ffmpeg -threads 1 -i crew_cif_timecode-2.h264 -f null -
> 
> I get this: https://pastebin.com/9TLB0ewm
> 
> And with:
>     $ ffmpeg -threads 2 -i crew_cif_timecode-2.h264 -f null -
> 
> I get this: https://pastebin.com/upaJUXUA
> 
> Any value above 1 should be enough to reproduce.
> 
> It's possible it may only present itself on Linux (if you are on Windows).

No, i can reproduce it on Windows with a mingw-w64 build. Same output as
the one you pasted, and your patch fixes it.

Patch hide | download patch | download mbox

diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 58e1aaf02f..d09cee4b13 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -358,6 +358,7 @@  int ff_h264_update_thread_context(AVCodecContext *dst,
         h->mb_num    = h1->mb_num;
         h->mb_stride = h1->mb_stride;
         h->b_stride  = h1->b_stride;
+        h->x264_build = h1->x264_build;
 
         if (h->context_initialized || h1->context_initialized) {
             if ((err = h264_slice_header_init(h)) < 0) {
@@ -399,7 +400,6 @@  int ff_h264_update_thread_context(AVCodecContext *dst,
 
     h->enable_er       = h1->enable_er;
     h->workaround_bugs = h1->workaround_bugs;
-    h->x264_build      = h1->x264_build;
     h->droppable       = h1->droppable;
 
     // extradata/NAL handling