diff options
author | Timo Teräs <timo.teras@iki.fi> | 2018-06-04 17:36:19 +0300 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2018-06-15 22:31:13 +0200 |
commit | f0e4bc61e31d9d766920837422fdca95e82f771b (patch) | |
tree | 3d85b94224e9d4c708db6e5abc4b38026ef94ffb | |
parent | 36628bd215699afaeec732f54fc08287e3f76b56 (diff) | |
download | ffmpeg-f0e4bc61e31d9d766920837422fdca95e82f771b.tar.gz |
avformat/movenc: fix recognization of cover image streams
For chapter images, the mov demux produces streams with disposition set
to attached_pic+timed_thumbnails. This patch fixes to properly recognize
streams that should be encoded as cover image (ones with only and only
attached_pic disposition set).
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
(cherry picked from commit 2223811b015926fec68473a08016d40cea0989b2)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavformat/movenc.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 9beb1e2395..44f468d19f 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -140,10 +140,17 @@ static int co64_required(const MOVTrack *track) return 0; } +static int is_cover_image(const AVStream *st) +{ + /* Eg. AV_DISPOSITION_ATTACHED_PIC | AV_DISPOSITION_TIMED_THUMBNAILS + * is encoded as sparse video track */ + return st && st->disposition == AV_DISPOSITION_ATTACHED_PIC; +} + static int rtp_hinting_needed(const AVStream *st) { /* Add hint tracks for each real audio and video stream */ - if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) + if (is_cover_image(st)) return 0; return st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO || st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO; @@ -1565,7 +1572,7 @@ static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track) { int tag; - if (track->st->disposition & AV_DISPOSITION_ATTACHED_PIC) + if (is_cover_image(track->st)) return ff_codec_get_tag(codec_cover_image_tags, track->par->codec_id); if (track->mode == MODE_MP4 || track->mode == MODE_PSP) @@ -3440,10 +3447,8 @@ static int mov_write_covr(AVIOContext *pb, AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { MOVTrack *trk = &mov->tracks[i]; - AVStream *st = s->streams[i]; - if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC) || - trk->cover_image.size <= 0) + if (!is_cover_image(trk->st) || trk->cover_image.size <= 0) continue; if (!pos) { @@ -3986,15 +3991,13 @@ static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov, AVFormat AVStream *st = track->st; AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL,0); - if (track->par->codec_type == AVMEDIA_TYPE_VIDEO) { + if (track->par->codec_type == AVMEDIA_TYPE_VIDEO && !is_cover_image(st)) { type = "video"; } else if (track->par->codec_type == AVMEDIA_TYPE_AUDIO) { type = "audio"; } else { continue; } - if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) - continue; props = (AVCPBProperties*)av_stream_get_side_data(track->st, AV_PKT_DATA_CPB_PROPERTIES, NULL); @@ -4608,7 +4611,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; - if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) + if (is_cover_image(st)) continue; if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) has_video = 1; @@ -4758,7 +4761,7 @@ static int mov_write_identification(AVIOContext *pb, AVFormatContext *s) int video_streams_nb = 0, audio_streams_nb = 0, other_streams_nb = 0; for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; - if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) + if (is_cover_image(st)) continue; if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) video_streams_nb++; @@ -4949,8 +4952,7 @@ static int mov_flush_fragment(AVFormatContext *s, int force) int buf_size, moov_size; for (i = 0; i < mov->nb_streams; i++) - if (!mov->tracks[i].entry && - (i >= s->nb_streams || !(s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC))) + if (!mov->tracks[i].entry && !is_cover_image(mov->tracks[i].st)) break; /* Don't write the initial moov unless all tracks have data */ if (i < mov->nb_streams && !force) @@ -5531,21 +5533,19 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) { MOVMuxContext *mov = s->priv_data; MOVTrack *trk; - AVStream *st; if (!pkt) { mov_flush_fragment(s, 1); return 1; } - st = s->streams[pkt->stream_index]; trk = &mov->tracks[pkt->stream_index]; - if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) { + if (is_cover_image(trk->st)) { int ret; - if (st->nb_frames >= 1) { - if (st->nb_frames == 1) + if (trk->st->nb_frames >= 1) { + if (trk->st->nb_frames == 1) av_log(s, AV_LOG_WARNING, "Got more than one picture in stream %d," " ignoring.\n", pkt->stream_index); return 0; @@ -5804,7 +5804,7 @@ static void enable_tracks(AVFormatContext *s) if (st->codecpar->codec_type <= AVMEDIA_TYPE_UNKNOWN || st->codecpar->codec_type >= AVMEDIA_TYPE_NB || - st->disposition & AV_DISPOSITION_ATTACHED_PIC) + is_cover_image(st)) continue; if (first[st->codecpar->codec_type] < 0) |