Control: forwarded -1 [email protected] Hi Mathieu,
I would appreciate if in future you could provide a bit more details when reassigning bugs. The quote below was all that I had to start working on this issue, which is terse. My understanding of this we are talking about a curious feature in the MKV container: apparently, you can attach cover art into the container. Libavformat allows applications to access embedded images by providing an extra stream. Please someone correct me, but my understanding of http://git.videolan.org/?p=ffmpeg.git;a=commit;h=511585c is that libavformat implements this inconsistently for different containers. I wonder how did this happen, is there some deeper reason for this inconsistency? Minidlna seems to have stumbled over this inconsistency and seems to work fine with that patch that was discussed with FFmpeg, but not with Libav. This is a bit disappointing, maybe you could forward such clearly upstream bugs yourself to avoid having the package maintainers as extra round-trip? Thanks. I do not use minidlna myself, so I cannot verify this issue myself. However, I've tried to apply the patch that was submitted against FFmpeg, which I have attached to this email. I've also compared the output of "avprobe" on the suggested test sample https://sourceforge.net/projects/matroska/files/test_files/cover_art.mkv with and without the patch. It seems promising to me, but again, I have no means to verify this issue, so please someone else take over of testing it and getting the patch ready for submission in Libav. Thanks, Reinahrd On Sat, Apr 4, 2015 at 11:09 AM, Mathieu Malaterre <[email protected]> wrote: > reassign 781812 libav 6:11.3-1 > thanks > > This has been fixed in ffmpeg: > > https://trac.ffmpeg.org/ticket/4423#comment:8 > > Since minidlna currently uses libav, I am leaving this bug open. > > _______________________________________________ > pkg-multimedia-maintainers mailing list > [email protected] > http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-multimedia-maintainers -- regards, Reinhard
From 6338c434c62d748c95c958ab9b5eae26033f38c3 Mon Sep 17 00:00:00 2001 From: wm4 <[email protected]> Date: Fri, 3 Apr 2015 16:11:53 +0200 Subject: [PATCH] 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 <[email protected]> Conflicts: libavformat/matroskadec.c --- libavformat/matroska.c | 9 +++++++-- libavformat/matroska.h | 1 + libavformat/matroskadec.c | 48 ++++++++++++++++++++++++++++++++++------------- libavformat/matroskaenc.c | 5 +++++ 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/libavformat/matroska.c b/libavformat/matroska.c index 47fdea6..eca1e41 100644 --- a/libavformat/matroska.c +++ b/libavformat/matroska.c @@ -89,12 +89,17 @@ const CodecTags ff_mkv_codec_tags[]={ {"" , AV_CODEC_ID_NONE} }; -const CodecMime ff_mkv_mime_tags[] = { - {"text/plain" , AV_CODEC_ID_TEXT}, +const CodecMime ff_mkv_image_mime_tags[] = { {"image/gif" , AV_CODEC_ID_GIF}, {"image/jpeg" , AV_CODEC_ID_MJPEG}, {"image/png" , AV_CODEC_ID_PNG}, {"image/tiff" , AV_CODEC_ID_TIFF}, + + {"" , AV_CODEC_ID_NONE} +}; + +const CodecMime ff_mkv_mime_tags[] = { + {"text/plain" , AV_CODEC_ID_TEXT}, {"application/x-truetype-font", AV_CODEC_ID_TTF}, {"application/x-font" , AV_CODEC_ID_TTF}, diff --git a/libavformat/matroska.h b/libavformat/matroska.h index d8f4f8e..a7a22a9 100644 --- a/libavformat/matroska.h +++ b/libavformat/matroska.h @@ -254,6 +254,7 @@ typedef struct CodecTags{ extern const CodecTags ff_mkv_codec_tags[]; extern const CodecMime ff_mkv_mime_tags[]; +extern const CodecMime ff_mkv_image_mime_tags[]; extern const AVMetadataConv ff_mkv_metadata_conv[]; int ff_mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode); diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index d352c8b..2f4f075 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1887,22 +1887,44 @@ 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; - st->codec->extradata = av_malloc(attachments[j].bin.size); - if (!st->codec->extradata) - break; - st->codec->extradata_size = attachments[j].bin.size; - 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; } } - attachments[j].stream = st; + + 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; + st->codec->extradata = av_malloc(attachments[j].bin.size); + if (!st->codec->extradata) + break; + + st->codec->extradata_size = attachments[j].bin.size; + 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; + } } } diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 49e5bf3..91c4459 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1098,6 +1098,11 @@ static int mkv_write_attachments(AVFormatContext *s) mimetype = ff_mkv_mime_tags[i].str; break; } + for (i = 0; ff_mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++) + if (ff_mkv_image_mime_tags[i].id == st->codec->codec_id) { + mimetype = ff_mkv_image_mime_tags[i].str; + break; + } } if (!mimetype) { av_log(s, AV_LOG_ERROR, "Attachment stream %d has no mimetype tag and " -- 2.1.0
cover_art.mkv.avprobe_new
Description: Binary data
cover_art.mkv.avprobe_old
Description: Binary data
_______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
