summaryrefslogtreecommitdiff
path: root/libavformat/movenc.c
diff options
context:
space:
mode:
authorJohn Stebbins <jstebbins@jetheaddev.com>2018-08-27 14:11:14 -0700
committerJames Almer <jamrial@gmail.com>2018-09-08 19:08:36 -0300
commit4cfb01d6ae545cec4a507113a6cbcf3b6e727e94 (patch)
tree029be269e5a521f0be2fab62017e9f54180d94b5 /libavformat/movenc.c
parent981178f3b0b547a228804ff36641b2237eb75a16 (diff)
lavf/movenc: Fail when codec tag is invalid for format
Fixes ticket #6897 Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat/movenc.c')
-rw-r--r--libavformat/movenc.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 8a3b651514..3ebc7abd8b 100644
--- a/libavformat/movenc.c
+++ b/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;
}