[FFmpeg-devel] [PATCH v2] avformat/movenc: properly handle cover image codecs

Timo Teräs timo.teras at iki.fi
Fri Jun 1 02:24:39 EEST 2018


Find codec tag for attached images using appropriate list of
supported image formats.

This fixes writing the cover image to m4v/m4a and other container
formats that do not allow these codecs as a track.

Signed-off-by: Timo Teräs <timo.teras at iki.fi>
---
This replaces the previous patch:
 PATCH] [RFC] avformat/movenc: support covert images for ipod muxer

It appears that query_codec() is used only to figure out which stream
to select as the default copy stream. Fixing it properly for movenc
attached pictures is difficult, as the stream disposition would need
to be passed through the call stack. Additionally, it would make sense
to rewrite the selection logic open_output_file() to not use APIC
special tag and be based on the input/output dispositions.

So this just adds proper handling of the codecs in mov_init() phase
which fixes most of the usability issues.

Please backport to 4.0 stable branch too.

Changes in v2:
 - map the codec to the actual covr image tag value and
   use that when writing the cover image instead of doing
   a new switch over the codec

 libavformat/movenc.c | 30 ++++++++++++------------------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 7e616e866f..4ba90135df 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1557,10 +1557,20 @@ static int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track)
     return tag;
 }
 
+static const AVCodecTag codec_cover_image_tags[] = {
+    { AV_CODEC_ID_MJPEG,  0xD },
+    { AV_CODEC_ID_PNG,    0xE },
+    { AV_CODEC_ID_BMP,    0x1B },
+    { AV_CODEC_ID_NONE, 0 },
+};
+
 static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
 {
     int tag;
 
+    if (track->st->disposition & AV_DISPOSITION_ATTACHED_PIC)
+        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)
@@ -3429,7 +3439,7 @@ static int mov_write_covr(AVIOContext *pb, AVFormatContext *s)
 {
     MOVMuxContext *mov = s->priv_data;
     int64_t pos = 0;
-    int i, type;
+    int i;
 
     for (i = 0; i < s->nb_streams; i++) {
         MOVTrack *trk = &mov->tracks[i];
@@ -3439,22 +3449,6 @@ static int mov_write_covr(AVIOContext *pb, AVFormatContext *s)
             trk->cover_image.size <= 0)
             continue;
 
-        switch (st->codecpar->codec_id) {
-        case AV_CODEC_ID_MJPEG:
-            type = 0xD;
-            break;
-        case AV_CODEC_ID_PNG:
-            type = 0xE;
-            break;
-        case AV_CODEC_ID_BMP:
-            type = 0x1B;
-            break;
-        default:
-            av_log(s, AV_LOG_ERROR, "unsupported codec_id (0x%x) for cover",
-                   st->codecpar->codec_id);
-            continue;
-        }
-
         if (!pos) {
             pos = avio_tell(pb);
             avio_wb32(pb, 0);
@@ -3462,7 +3456,7 @@ static int mov_write_covr(AVIOContext *pb, AVFormatContext *s)
         }
         avio_wb32(pb, 16 + trk->cover_image.size);
         ffio_wfourcc(pb, "data");
-        avio_wb32(pb, type);
+        avio_wb32(pb, trk->tag);
         avio_wb32(pb , 0);
         avio_write(pb, trk->cover_image.data, trk->cover_image.size);
     }
-- 
2.17.0



More information about the ffmpeg-devel mailing list