[FFmpeg-cvslog] matroskadec: export cover art correctly

2015-05-14 Thread wm4
ffmpeg | branch: release/2.6 | wm4 nfx...@googlemail.com | Fri Apr  3 
16:11:53 2015 +0200| [262c678357f5708ad0559270530d90af566d3d67] | committer: 
Andreas Cadhalpun

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 michae...@gmx.at
(cherry picked from commit 511585ce7f7272e5069ef011d6be5f073d268901)
Signed-off-by: Andreas Cadhalpun andreas.cadhal...@googlemail.com

 http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=262c678357f5708ad0559270530d90af566d3d67
---

 libavformat/matroska.c|9 +++--
 libavformat/matroska.h|1 +
 libavformat/matroskadec.c |   41 +++--
 libavformat/matroskaenc.c |5 +
 4 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/libavformat/matroska.c b/libavformat/matroska.c
index bc5007a..faa662d 100644
--- a/libavformat/matroska.c
+++ b/libavformat/matroska.c
@@ -99,12 +99,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},
 {application/vnd.ms-opentype, AV_CODEC_ID_OTF},
diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index 391c56c..344b2c3 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -280,6 +280,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[];
 extern const char * const 
ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREOMODE_TYPE_NB];
 extern const char * const 
ff_matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_PLANE_COUNT];
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 6c0d0d5..da96421 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 

[FFmpeg-cvslog] matroskadec: export cover art correctly

2015-04-08 Thread wm4
ffmpeg | branch: master | wm4 nfx...@googlemail.com | Fri Apr  3 16:11:53 
2015 +0200| [c4d37cd9ef6e374bb888f6273259b10fac5bd909] | committer: Anton 
Khirnov

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.

Signed-off-by: Anton Khirnov an...@khirnov.net

 http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c4d37cd9ef6e374bb888f6273259b10fac5bd909
---

 libavformat/matroska.c|9 +++--
 libavformat/matroska.h|1 +
 libavformat/matroskadec.c |   47 +
 libavformat/matroskaenc.c |5 +
 4 files changed, 48 insertions(+), 14 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..7dac7be 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1887,22 +1887,45 @@ 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;
+

[FFmpeg-cvslog] matroskadec: export cover art correctly

2015-04-03 Thread wm4
ffmpeg | branch: master | wm4 nfx...@googlemail.com | Fri Apr  3 16:11:53 
2015 +0200| [511585ce7f7272e5069ef011d6be5f073d268901] | committer: Michael 
Niedermayer

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 michae...@gmx.at

 http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=511585ce7f7272e5069ef011d6be5f073d268901
---

 libavformat/matroska.c|9 +++--
 libavformat/matroska.h|1 +
 libavformat/matroskadec.c |   41 +++--
 libavformat/matroskaenc.c |5 +
 4 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/libavformat/matroska.c b/libavformat/matroska.c
index bc5007a..faa662d 100644
--- a/libavformat/matroska.c
+++ b/libavformat/matroska.c
@@ -99,12 +99,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},
 {application/vnd.ms-opentype, AV_CODEC_ID_OTF},
diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index 391c56c..344b2c3 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -280,6 +280,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[];
 extern const char * const 
ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREOMODE_TYPE_NB];
 extern const char * const 
ff_matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_PLANE_COUNT];
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index cad207e..dd0bdce 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;
+