[FFmpeg-devel] [PATCH 2/2] avcodec/v4l2: fix segmentation fault on codec exit

Jorge Ramirez-Ortiz jorge.ramirez-ortiz at linaro.org
Sat Oct 7 00:45:52 EEST 2017


On 10/06/2017 11:38 PM, Jorge Ramirez-Ortiz wrote:
> On 10/06/2017 10:01 PM, Mark Thompson wrote:
>> On 06/10/17 20:53, Mark Thompson wrote:
>>> On 06/10/17 08:52, Jorge Ramirez-Ortiz wrote:
>>>> It occurs when the codec is closed while buffer references still
>>>> exist. This is a regression from the original patchset where support
>>>> for this use-case was implemented.
>>>>
>>>> The regression occurred while cleaning the code for the last patchset
>>>> (decoding was tested only with ffplay which disposes of the buffer
>>>> straightaway hence the feature went in broken/untested)
>>>> ---
>>>>   libavcodec/v4l2_m2m.c | 6 ++++--
>>>>   1 file changed, 4 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c
>>>> index bd96a6d..5e85bcb 100644
>>>> --- a/libavcodec/v4l2_m2m.c
>>>> +++ b/libavcodec/v4l2_m2m.c
>>>> @@ -331,8 +331,10 @@ int ff_v4l2_m2m_codec_end(AVCodecContext *avctx)
>>>>         ff_v4l2_context_release(&s->output);
>>>>   -    if (atomic_load(&s->refcount))
>>>> -        av_log(avctx, AV_LOG_ERROR, "ff_v4l2m2m_codec_end leaving pending 
>>>> buffers\n");
>>>> +    if (atomic_load(&s->refcount)) {
>>>> +        av_log(avctx, AV_LOG_DEBUG, "ff_v4l2m2m_codec_end leaving pending 
>>>> buffers\n");
>>>> +        return 0;
>>>> +    }
>>>>         ff_v4l2_context_release(&s->capture);
>>>>       sem_destroy(&s->refsync);
>>>>
>>> Trying to test this, I segfault when decoding finishes with this patch 
>>> applied (exynos s5p-mfc):
>>>
>>> (gdb) r
>>> Starting program: /home/mrt/ffmpeg/v4l2/build/ffmpeg_g -threads 1 -v 55 -y 
>>> -c:v h264_v4l2m2m -i /home/mrt/bbb_1080_264.mp4 -an -frames:v 100 -f null -
>>> ...
>>> Output file #0 (pipe:):
>>>    Output stream #0:0 (video): 100 frames encoded; 100 packets muxed (40000 
>>> bytes);
>>>    Total: 100 packets (40000 bytes) muxed
>>> [h264_v4l2m2m @ 0x1403720] ff_v4l2m2m_codec_end leaving pending buffers
>>> 100 frames successfully decoded, 0 decoding errors
>>> ...
>>> Thread 1 "ffmpeg_g" received signal SIGSEGV, Segmentation fault.
>>> ff_v4l2_context_set_status (ctx=ctx at entry=0x10fc, cmd=1074026003) at 
>>> src/libavcodec/v4l2_context.c:489
>>> 489         int type = ctx->type;
>>> (gdb) bt
>>> #0  ff_v4l2_context_set_status (ctx=ctx at entry=0x10fc, cmd=1074026003) at 
>>> src/libavcodec/v4l2_context.c:489
>>> #1  0x00798c24 in ff_v4l2_m2m_codec_end (avctx=0x1403720) at 
>>> src/libavcodec/v4l2_m2m.c:319
>>> #2  0x00835aba in buffer_replace (src=0x0, dst=<optimized out>) at 
>>> src/libavutil/buffer.c:120
>>> #3  av_buffer_unref (buf=buf at entry=0x14d8b2c) at src/libavutil/buffer.c:130
>>> #4  0x008417ac in av_frame_unref (frame=frame at entry=0x14d8a30) at 
>>> src/libavutil/frame.c:515
>>> #5  0x00841d58 in av_frame_unref (frame=<optimized out>) at 
>>> src/libavutil/frame.c:147
>>> #6  av_frame_free (frame=frame at entry=0x1403d9c) at src/libavutil/frame.c:168
>>> #7  0x00082bce in ffmpeg_cleanup (ret=0) at src/fftools/ffmpeg.c:541
>>> #8  0x00079c42 in exit_program (ret=0) at src/fftools/cmdutils.c:138
>>> #9  0x0006efba in main (argc=<optimized out>, argv=<optimized out>) at 
>>> src/fftools/ffmpeg.c:4793
>>> (gdb) p ctx
>>> $1 = (V4L2Context *) 0x10fc
>>> (gdb) f 1
>>> #1  0x00798c24 in ff_v4l2_m2m_codec_end (avctx=0x1403720) at 
>>> src/libavcodec/v4l2_m2m.c:319
>>> 319         ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF);
>>> (gdb) p s
>>> $2 = (V4L2m2mContext *) 0x0
>>> (gdb)
>>>
>> To clarify, it segfaults in the same way without the patch as well.
>
> vow, very strange.
>
> would you mind doing a clean build with the patch applied?
> I am asking because that test works fine on my db410c and 820 (and hardware 
> shouldnt make a difference in this test)
>
> also the team at Kodi also tested the fix on their imx6
>
>

this is what I see when I run your command

linaro at db820 git.zoltan.ffmpeg (ffmpeg/master $)]$ ./ffmpeg_g -threads 1 -v 55 
-y -c:v h264_v4l2m2m -i ~/Videos/h264.FVDO_Freeway_720p.264 -an -frames:v 100 -f 
null -

[...]


[h264_v4l2m2m @ 0xaaaadd3bbb50] capture: NV12 20 buffers initialized: 1280x0736, 
sizeimage 01425408, bytesperline 00001280
cur_dts is invalid (this is harmless if it occurs once at the start per stream)
     Last message repeated 9 times
detected 4 logical cores
[graph 0 input from stream 0:0 @ 0xaaaadd419680] Setting 'video_size' to value 
'1280x720'
[graph 0 input from stream 0:0 @ 0xaaaadd419680] Setting 'pix_fmt' to value '25'
[graph 0 input from stream 0:0 @ 0xaaaadd419680] Setting 'time_base' to value 
'1/1200000'
[graph 0 input from stream 0:0 @ 0xaaaadd419680] Setting 'pixel_aspect' to value 
'0/1'
[graph 0 input from stream 0:0 @ 0xaaaadd419680] Setting 'sws_param' to value 
'flags=2'
[graph 0 input from stream 0:0 @ 0xaaaadd419680] Setting 'frame_rate' to value 
'25/1'
[graph 0 input from stream 0:0 @ 0xaaaadd419680] w:1280 h:720 pixfmt:nv12 
tb:1/1200000 fr:25/1 sar:0/1 sws_param:flags=2
[AVFilterGraph @ 0xaaaadd438530] query_formats: 3 queried, 2 merged, 0 already 
done, 0 delayed
Output #0, null, to 'pipe:':
   Metadata:
     encoder         : Lavf57.82.102
     Stream #0:0, 0, 1/25: Video: wrapped_avframe, 1 reference frame, 
nv12(left), 1280x720, 0/1, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
     Metadata:
       encoder         : Lavc57.106.104 wrapped_avframe
No more output streams to write to, finishing.:00.04 bitrate=N/A speed=0.0398x
frame=  100 fps= 91 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.0363x
video:52kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing 
overhead: unknown
Input file #0 (/home/linaro/Videos/h264.FVDO_Freeway_720p.264):
   Input stream #0:0 (video): 209 packets read (4070226 bytes); 101 frames decoded;
   Total: 209 packets (4070226 bytes) demuxed
Output file #0 (pipe:):
   Output stream #0:0 (video): 100 frames encoded; 100 packets muxed (52800 bytes);
   Total: 100 packets (52800 bytes) muxed
[h264_v4l2m2m @ 0xaaaadd3bbb50] ff_v4l2m2m_codec_end leaving pending buffers   
<---------------------------------------
101 frames successfully decoded, 0 decoding errors
[AVIOContext @ 0xaaaadd366d70] Statistics: 4096000 bytes read, 0 seeks


>
>>
>> - Mark
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>



More information about the ffmpeg-devel mailing list