[FFmpeg-devel] [PATCH] API changes in ffmpeg.c
Thilo Borgmann
thilo.borgmann
Fri Apr 10 23:11:10 CEST 2009
Michael Niedermayer schrieb:
> On Fri, Apr 10, 2009 at 09:11:10PM +0200, Thilo Borgmann wrote:
>
>> Michael Niedermayer schrieb:
>>
>>> On Fri, Apr 10, 2009 at 08:29:25PM +0200, Thilo Borgmann wrote:
>>>
>>>
>>>> Michael Niedermayer schrieb:
>>>>
>>>>
>>>>>
>>>>>
>>>>>>>> &picture, &got_picture, ptr, len);
>>>>>>>> + ret = avcodec_decode_video2(ist->st->codec,
>>>>>>>> + &picture,
>>>>>>>> &got_picture, pkt);
>>>>>>>>
>>>>>>>>
>>>>>>> Crash here.
>>>>>>>
>>>>>>>
>>>>>> This is revision 1 which fixes the crash during make test.
>>>>>>
>>>>>>
>>>>> probably ok if tested
>>>>>
>>>>>
>>>>>
>>>> Although applied, I tested it again using ffmpeg for transcoding the
>>>> corepng.avi into yuv format.
>>>>
>>>> This revealed a bug in my ffmpeg.c patch, but this bug breaks CorePNG
>>>> decoding only, since this is the only one using more information of the
>>>> provided packet than .data and .size attributes.
>>>>
>>>> FFplay is not broken as it uses no local AVPackets but the "original"
>>>> one.
>>>>
>>>> I attached a little patch for the time being, but I would propose to add
>>>> a "av_copy_packet" function into libavcodec/avpacket.c as future codecs
>>>> will also use more attributes of the avpacket and even others than just
>>>> the .flags attribute.
>>>>
>>>>
>>> patch ok
>>>
>>>
>> While I was thinking about a possible copy function, I realized that a
>> shallow copy would be enough here, so a simple avpkt = *pkt will do. A
>> function for a deep copy is not yet needed so I'm not going to add one.
>>
>> Reinspecting ffmpeg.c, revision 1 does solve it best in my eyes, so the
>> last patch here has become obsolete, if Michael agrees.
>>
>> Of course, this new patch has been tested using "make test" and the
>> transcoding into yuv.
>>
>> TB
>>
>
>
>> diff --git a/ffmpeg.c b/ffmpeg.c
>> index 68f84fe..fb841c4 100644
>> --- a/ffmpeg.c
>> +++ b/ffmpeg.c
>> @@ -1185,7 +1185,6 @@ static int output_packet(AVInputStream *ist, int ist_index,
>> int got_subtitle;
>> AVPacket avpkt;
>>
>> - av_init_packet(&avpkt);
>>
>> if(ist->next_pts == AV_NOPTS_VALUE)
>> ist->next_pts= ist->pts;
>> @@ -1195,13 +1194,13 @@ static int output_packet(AVInputStream *ist, int ist_index,
>> avpkt.data = NULL;
>> avpkt.size = 0;
>> goto handle_eof;
>> + } else {
>> + avpkt = *pkt;
>> }
>>
>
> i suspect that this can end with partially initialized avpkt
>
>
In any case the av_init_packet() call is redundant or unneeded.
Ok for a "clean" code I can put it back in, may be time will come when
ffmpeg.c makes use of more than .data and .size for the pkt==NULL case.
Although, I would like to put it back into the case where avpkt = *pkt
is not called, not to use redundant assignments most of the time during
decoding.
I think we all are happy with that?
See revision 2.
TB
-------------- next part --------------
A non-text attachment was scrubbed...
Name: tb.ffmpegHotfix.rev2.patch
Type: text/x-patch
Size: 889 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090410/c81ea172/attachment.bin>
More information about the ffmpeg-devel
mailing list