|
|
|
@@ -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) |
|
|
|
|