[FFmpeg-devel] [PATCH 2/3] avformat/avienc: add reserve_index_space option

Tobias Rapp t.rapp at noa-archive.com
Mon Jan 23 12:12:13 EET 2017


On 20.01.2017 21:02, Michael Niedermayer wrote:
> On Fri, Jan 20, 2017 at 05:06:59PM +0100, Tobias Rapp wrote:
>> On 20.01.2017 15:56, Tobias Rapp wrote:
>>> On 19.01.2017 18:32, Michael Niedermayer wrote:
>>>> On Wed, Jan 18, 2017 at 10:27:02AM +0100, Tobias Rapp wrote:
>>>>> Allows the user to reserve space for the ODML master index. A sufficient
>>>>> sized master index in the AVI header avoids storing follow-up master
>>>>> indexes within the 'movi' data later.
>>>>>
>>>>> If the option is omitted or zero the index size is estimated from output
>>>>> duration and bitrate. A worst-case bitrate for video streams is assumed
>>>>> in case it is not available.
>>>>>
>>>>> Note: fate reference files changed because the video stream had zero
>>>>> bitrate before and is guessed now.
>>>>>
>>>>> Signed-off-by: Tobias Rapp <t.rapp at noa-archive.com>
>>>>> ---
>>>>> libavformat/avi.h                       |  1 -
>>>>> libavformat/avienc.c                    | 77
>>>>> ++++++++++++++++++++++++++++++---
>>>>> libavformat/version.h                   |  2 +-
>>>>> tests/ref/fate/mpeg4-bsf-unpack-bframes |  2 +-
>>>>> tests/ref/lavf-fate/avi_cram            |  2 +-
>>>>> 5 files changed, 74 insertions(+), 10 deletions(-)
>>>>
>>>> this breaks segment:
>>>> ./ffmpeg -i lena.pnm -f segment test%d.avi
>>>>
>>>> possibly related to avi_init()
>>>
>>> Yes, I can reproduce the problem when going back to Git master and just
>>> adding a dummy init (see attached diff). Not sure how to fix this, other
>>> muxers also have an init but seem to work fine (mkv) ...
>>
>> Apparently the codec_tag is cleared in seg_write_header() around line 811:
>>
>> [...]
>>
>> See http://git.videolan.org/?p=ffmpeg.git;a=blob;f=libavformat/segment.c;hb=HEAD#l811
>>
>> If .init is unset, the header is written before the codec_tag is
>> cleared. If .init is set, it is written after these lines.
>
> the return code of your init function is wrong i think

Thanks for the hint. Changed the return value to "1" and now 
avi_write_header() keeps being executed before the codec_tag is cleared 
in seg_write_header(). Attached an updated version of the patch.

> also  this patch causes a 1 byte difference in the output of:
> ./ffmpeg -i ~/tickets/1116/AVI-RLE_MP3.avi -vcodec copy -an out2.avi
>
> is that intended ?

Yes, it is expected in this case. The video stream has a reported 
bitrate of "0" which was used as-is for the "dwMaxBytesPerSec" field in 
the "avih" chunk before. Now the field is changed due to the worst-case 
bitrate guessing (similar to the FATE reference file changes). A log 
message hint is printed when adding "-loglevel debug" and maybe it 
should be made more prominent (AV_LOG_WARNING?) but there is not much a 
user can do and I think it's unlikely it has a negative effect on players.

Regards,
Tobias
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-avformat-avienc-add-reserve_index_space-option.patch
Type: text/x-patch
Size: 10866 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20170123/22008a0e/attachment.bin>


More information about the ffmpeg-devel mailing list