mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 12:09:55 +00:00
avformat/movenc: properly handle cover image codecs
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@iki.fi> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
4aba45ca1f
commit
12205d2c89
@ -1557,10 +1557,20 @@ static int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track)
|
|||||||
return tag;
|
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)
|
static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
|
||||||
{
|
{
|
||||||
int tag;
|
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)
|
if (track->mode == MODE_MP4 || track->mode == MODE_PSP)
|
||||||
tag = track->par->codec_tag;
|
tag = track->par->codec_tag;
|
||||||
else if (track->mode == MODE_ISM)
|
else if (track->mode == MODE_ISM)
|
||||||
@ -3429,7 +3439,7 @@ static int mov_write_covr(AVIOContext *pb, AVFormatContext *s)
|
|||||||
{
|
{
|
||||||
MOVMuxContext *mov = s->priv_data;
|
MOVMuxContext *mov = s->priv_data;
|
||||||
int64_t pos = 0;
|
int64_t pos = 0;
|
||||||
int i, type;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < s->nb_streams; i++) {
|
for (i = 0; i < s->nb_streams; i++) {
|
||||||
MOVTrack *trk = &mov->tracks[i];
|
MOVTrack *trk = &mov->tracks[i];
|
||||||
@ -3439,22 +3449,6 @@ static int mov_write_covr(AVIOContext *pb, AVFormatContext *s)
|
|||||||
trk->cover_image.size <= 0)
|
trk->cover_image.size <= 0)
|
||||||
continue;
|
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) {
|
if (!pos) {
|
||||||
pos = avio_tell(pb);
|
pos = avio_tell(pb);
|
||||||
avio_wb32(pb, 0);
|
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);
|
avio_wb32(pb, 16 + trk->cover_image.size);
|
||||||
ffio_wfourcc(pb, "data");
|
ffio_wfourcc(pb, "data");
|
||||||
avio_wb32(pb, type);
|
avio_wb32(pb, trk->tag);
|
||||||
avio_wb32(pb , 0);
|
avio_wb32(pb , 0);
|
||||||
avio_write(pb, trk->cover_image.data, trk->cover_image.size);
|
avio_write(pb, trk->cover_image.data, trk->cover_image.size);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user