Skip to content
Permalink
Browse files

lavf/movenc: Fail when codec tag is invalid for format

Fixes ticket #6897

Signed-off-by: James Almer <jamrial@gmail.com>
  • Loading branch information
jstebbins authored and jamrial committed Aug 27, 2018
1 parent 981178f commit 4cfb01d6ae545cec4a507113a6cbcf3b6e727e94
Showing with 30 additions and 16 deletions.
  1. +30 −16 libavformat/movenc.c
@@ -1535,9 +1535,9 @@ static int mov_get_rawvideo_codec_tag(AVFormatContext *s, MOVTrack *track)
return tag;
}

static int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track)
static unsigned int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track)
{
int tag = track->par->codec_tag;
unsigned int tag = track->par->codec_tag;

if (!tag || (s->strict_std_compliance >= FF_COMPLIANCE_NORMAL &&
(track->par->codec_id == AV_CODEC_ID_DVVIDEO ||
@@ -1589,31 +1589,45 @@ static const AVCodecTag codec_cover_image_tags[] = {
{ AV_CODEC_ID_NONE, 0 },
};

static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
static unsigned int validate_codec_tag(const AVCodecTag *const *tags,
unsigned int tag, int codec_id)
{
int tag;
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 (avpriv_toupper4(codec_tags->tag) == avpriv_toupper4(tag) &&
codec_tags->id == codec_id)
return codec_tags->tag;
codec_tags++;
}
}
return 0;
}

static unsigned int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
{
unsigned int tag;

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
tag = mov_get_codec_tag(s, track);

if (track->mode == MODE_MOV)
tag = mov_get_codec_tag(s, track);
else
tag = validate_codec_tag(s->oformat->codec_tag, track->par->codec_tag,
track->par->codec_id);
return tag;
}

0 comments on commit 4cfb01d

Please sign in to comment.
You can’t perform that action at this time.