aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/matroskadec.c
diff options
context:
space:
mode:
authorwm4 <nfxjfg@googlemail.com>2015-04-03 16:11:53 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-04-04 02:25:56 +0200
commit511585ce7f7272e5069ef011d6be5f073d268901 (patch)
tree1d625358a59df9a7b70877bdd8395a448003ee36 /libavformat/matroskadec.c
parentf62880bfb8c72ccbfdce4dd9daf93af691060ddd (diff)
downloadffmpeg-511585ce7f7272e5069ef011d6be5f073d268901.tar.gz
matroskadec: export cover art correctly
Generally, libavformat exports cover art pictures as video streams with 1 packet and AV_DISPOSITION_ATTACHED_PIC set. Only matroskadec exported it as attachment with codec_id set to AV_CODEC_ID_MJPEG. Obviously, this should be consistent, so change the Matroska demuxer to export a AV_DISPOSITION_ATTACHED_PIC pseudo video stream. Matroska muxing is probably incorrect too. I know that it can create broken files with an audio track and just 1 video frame when e.g. remuxing mp3 with APIC to mkv. But for now this commit does not change anything about muxing, and also continues to write attachments with AV_CODEC_ID_MJPEG should the muxer application have special knowledge that the Matroska is broken in this way. Fixes trac #4423. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r--libavformat/matroskadec.c41
1 files changed, 31 insertions, 10 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index cad207e228..dd0bdceb3d 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2142,20 +2142,41 @@ static int matroska_read_header(AVFormatContext *s)
av_dict_set(&st->metadata, "filename", attachments[j].filename, 0);
av_dict_set(&st->metadata, "mimetype", attachments[j].mime, 0);
st->codec->codec_id = AV_CODEC_ID_NONE;
- st->codec->codec_type = AVMEDIA_TYPE_ATTACHMENT;
- if (ff_alloc_extradata(st->codec, attachments[j].bin.size))
- break;
- memcpy(st->codec->extradata, attachments[j].bin.data,
- attachments[j].bin.size);
- for (i = 0; ff_mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
- if (!strncmp(ff_mkv_mime_tags[i].str, attachments[j].mime,
- strlen(ff_mkv_mime_tags[i].str))) {
- st->codec->codec_id = ff_mkv_mime_tags[i].id;
+ for (i = 0; ff_mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
+ if (!strncmp(ff_mkv_image_mime_tags[i].str, attachments[j].mime,
+ strlen(ff_mkv_image_mime_tags[i].str))) {
+ st->codec->codec_id = ff_mkv_image_mime_tags[i].id;
+ break;
+ }
+ }
+
+ if (st->codec->codec_id != AV_CODEC_ID_NONE) {
+ st->disposition |= AV_DISPOSITION_ATTACHED_PIC;
+ st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
+
+ av_init_packet(&st->attached_pic);
+ if ((res = av_new_packet(&st->attached_pic, attachments[j].bin.size)) < 0)
+ return res;
+ memcpy(st->attached_pic.data, attachments[j].bin.data, attachments[j].bin.size);
+ st->attached_pic.stream_index = st->index;
+ st->attached_pic.flags |= AV_PKT_FLAG_KEY;
+ } else {
+ st->codec->codec_type = AVMEDIA_TYPE_ATTACHMENT;
+ if (ff_alloc_extradata(st->codec, attachments[j].bin.size))
break;
+ memcpy(st->codec->extradata, attachments[j].bin.data,
+ attachments[j].bin.size);
+
+ for (i = 0; ff_mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
+ if (!strncmp(ff_mkv_mime_tags[i].str, attachments[j].mime,
+ strlen(ff_mkv_mime_tags[i].str))) {
+ st->codec->codec_id = ff_mkv_mime_tags[i].id;
+ break;
+ }
}
+ attachments[j].stream = st;
}
- attachments[j].stream = st;
}
}