[FFmpeg-devel] [PATCH 3/4] lavf/movenc: Fail when codec tag is invalid for format
James Almer
jamrial at gmail.com
Tue Aug 28 00:03:58 EEST 2018
On 8/27/2018 5:48 PM, John Stebbins wrote:
> On 08/27/2018 01:29 PM, James Almer wrote:
>> On 8/27/2018 4:57 PM, John Stebbins wrote:
>>> Fixes ticket #6897
>>> ---
>>> libavformat/movenc.c | 40 +++++++++++++++++++++++++++++-----------
>>> 1 file changed, 29 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>>> index 8a3b651514..dd6281d210 100644
>>> --- a/libavformat/movenc.c
>>> +++ b/libavformat/movenc.c
>>> @@ -1589,6 +1589,26 @@ static const AVCodecTag codec_cover_image_tags[] = {
>>> { AV_CODEC_ID_NONE, 0 },
>>> };
>>>
>>> +static int validate_codec_tag(const AVCodecTag *const *tags,
>>> + unsigned int tag, int codec_id)
>>> +{
>>> + int i;
>>> +
>>> + /**
>>> + * Check that tag + id is in the table
>>> + */
>>> + for (i = 0; tags && tags[i]; i++) {
>>> + const AVCodecTag *codec_tags = tags[i];
>>> + while (codec_tags->id != AV_CODEC_ID_NONE) {
>>> + if (codec_tags->tag == tag && codec_tags->id == codec_id) {
>> Make both tag checks case insensitive using avpriv_toupper4(), then
>> return codec_tags->tag instead of 1 if the check succeeds.
>
> I've never seen mismatched case in these tags, but sure, why not... there's plenty I haven't seen.
AV1 in IVF is AV01, wheres in mp4 it's av01. That's the case i had in
mind when requesting this.
>
>>
>>> + return 1;
>>> + }
>>> + codec_tags++;
>>> + }
>>> + }
>>> + return 0;
>>> +}
>>> +
>>> static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
>>> {
>>> int tag;
>> Take the opportunity to change this, the ones in mov_get_codec_tag() and
>> in validate_codec_tag() to unsigned int, including the return types.
>> Codec tags in AVCodecTag are unsigned after all.
>>
>>> @@ -1596,23 +1616,21 @@ static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
>>> if (is_cover_image(track->st))
>>> return ff_codec_get_tag(codec_cover_image_tags, track->par->codec_id);
>>>
>>> - if (track->mode == MODE_MP4 || track->mode == MODE_PSP)
>>> - tag = track->par->codec_tag;
>>> - else if (track->mode == MODE_ISM)
>>> - tag = track->par->codec_tag;
>>> - else if (track->mode == MODE_IPOD) {
>>> + if (track->mode == MODE_IPOD)
>>> if (!av_match_ext(s->url, "m4a") &&
>>> !av_match_ext(s->url, "m4v") &&
>>> !av_match_ext(s->url, "m4b"))
>>> av_log(s, AV_LOG_WARNING, "Warning, extension is not .m4a nor .m4v "
>>> "Quicktime/Ipod might not play the file\n");
>>> - tag = track->par->codec_tag;
>>> - } else if (track->mode & MODE_3GP)
>>> - tag = track->par->codec_tag;
>>> - else if (track->mode == MODE_F4V)
>>> - tag = track->par->codec_tag;
>>> - else
>>> +
>>> + if (track->mode == MODE_MOV)
>>> tag = mov_get_codec_tag(s, track);
>>> + else
>>> + if (!validate_codec_tag(s->oformat->codec_tag, track->par->codec_tag,
>>> + track->par->codec_id))
>>> + tag = 0;
>>> + else
>>> + tag = track->par->codec_tag;
>> And of course make this simply
>>
>> tag = validate_codec_tag(...);
>>
>> Thanks.
>>
>>>
>>> return tag;
>>> }
>>>
>
>
> All good suggestions, thanks.
>
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list