Commit 2223811b authored by Timo Teräs's avatar Timo Teräs Committed by Michael Niedermayer

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: 's avatarTimo Teräs <timo.teras@iki.fi>
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 12205d2c
...@@ -143,10 +143,17 @@ static int co64_required(const MOVTrack *track) ...@@ -143,10 +143,17 @@ static int co64_required(const MOVTrack *track)
return 0; 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) static int rtp_hinting_needed(const AVStream *st)
{ {
/* Add hint tracks for each real audio and video stream */ /* 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 0;
return st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO || return st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO; st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
...@@ -1568,7 +1575,7 @@ static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track) ...@@ -1568,7 +1575,7 @@ static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
{ {
int tag; 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); 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)
...@@ -3443,10 +3450,8 @@ static int mov_write_covr(AVIOContext *pb, AVFormatContext *s) ...@@ -3443,10 +3450,8 @@ static int mov_write_covr(AVIOContext *pb, AVFormatContext *s)
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];
AVStream *st = s->streams[i];
if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC) || if (!is_cover_image(trk->st) || trk->cover_image.size <= 0)
trk->cover_image.size <= 0)
continue; continue;
if (!pos) { if (!pos) {
...@@ -3989,15 +3994,13 @@ static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov, AVFormat ...@@ -3989,15 +3994,13 @@ static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov, AVFormat
AVStream *st = track->st; AVStream *st = track->st;
AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL,0); 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"; type = "video";
} else if (track->par->codec_type == AVMEDIA_TYPE_AUDIO) { } else if (track->par->codec_type == AVMEDIA_TYPE_AUDIO) {
type = "audio"; type = "audio";
} else { } else {
continue; continue;
} }
if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
continue;
props = (AVCPBProperties*)av_stream_get_side_data(track->st, AV_PKT_DATA_CPB_PROPERTIES, NULL); props = (AVCPBProperties*)av_stream_get_side_data(track->st, AV_PKT_DATA_CPB_PROPERTIES, NULL);
...@@ -4657,7 +4660,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) ...@@ -4657,7 +4660,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
for (i = 0; i < s->nb_streams; i++) { for (i = 0; i < s->nb_streams; i++) {
AVStream *st = s->streams[i]; AVStream *st = s->streams[i];
if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) if (is_cover_image(st))
continue; continue;
if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
has_video = 1; has_video = 1;
...@@ -4807,7 +4810,7 @@ static int mov_write_identification(AVIOContext *pb, AVFormatContext *s) ...@@ -4807,7 +4810,7 @@ static int mov_write_identification(AVIOContext *pb, AVFormatContext *s)
int video_streams_nb = 0, audio_streams_nb = 0, other_streams_nb = 0; int video_streams_nb = 0, audio_streams_nb = 0, other_streams_nb = 0;
for (i = 0; i < s->nb_streams; i++) { for (i = 0; i < s->nb_streams; i++) {
AVStream *st = s->streams[i]; AVStream *st = s->streams[i];
if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) if (is_cover_image(st))
continue; continue;
if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
video_streams_nb++; video_streams_nb++;
...@@ -4998,8 +5001,7 @@ static int mov_flush_fragment(AVFormatContext *s, int force) ...@@ -4998,8 +5001,7 @@ static int mov_flush_fragment(AVFormatContext *s, int force)
int buf_size, moov_size; int buf_size, moov_size;
for (i = 0; i < mov->nb_streams; i++) for (i = 0; i < mov->nb_streams; i++)
if (!mov->tracks[i].entry && if (!mov->tracks[i].entry && !is_cover_image(mov->tracks[i].st))
(i >= s->nb_streams || !(s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC)))
break; break;
/* Don't write the initial moov unless all tracks have data */ /* Don't write the initial moov unless all tracks have data */
if (i < mov->nb_streams && !force) if (i < mov->nb_streams && !force)
...@@ -5581,21 +5583,19 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -5581,21 +5583,19 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
{ {
MOVMuxContext *mov = s->priv_data; MOVMuxContext *mov = s->priv_data;
MOVTrack *trk; MOVTrack *trk;
AVStream *st;
if (!pkt) { if (!pkt) {
mov_flush_fragment(s, 1); mov_flush_fragment(s, 1);
return 1; return 1;
} }
st = s->streams[pkt->stream_index];
trk = &mov->tracks[pkt->stream_index]; trk = &mov->tracks[pkt->stream_index];
if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) { if (is_cover_image(trk->st)) {
int ret; int ret;
if (st->nb_frames >= 1) { if (trk->st->nb_frames >= 1) {
if (st->nb_frames == 1) if (trk->st->nb_frames == 1)
av_log(s, AV_LOG_WARNING, "Got more than one picture in stream %d," av_log(s, AV_LOG_WARNING, "Got more than one picture in stream %d,"
" ignoring.\n", pkt->stream_index); " ignoring.\n", pkt->stream_index);
return 0; return 0;
...@@ -5854,7 +5854,7 @@ static void enable_tracks(AVFormatContext *s) ...@@ -5854,7 +5854,7 @@ static void enable_tracks(AVFormatContext *s)
if (st->codecpar->codec_type <= AVMEDIA_TYPE_UNKNOWN || if (st->codecpar->codec_type <= AVMEDIA_TYPE_UNKNOWN ||
st->codecpar->codec_type >= AVMEDIA_TYPE_NB || st->codecpar->codec_type >= AVMEDIA_TYPE_NB ||
st->disposition & AV_DISPOSITION_ATTACHED_PIC) is_cover_image(st))
continue; continue;
if (first[st->codecpar->codec_type] < 0) if (first[st->codecpar->codec_type] < 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment