Commit 00d751d4 authored by Martin Storsjö's avatar Martin Storsjö

movenc: Set tfhd default sample flags based on actual samples, if possible

This avoids assuming that e.g. audio samples are marked as
sync samples.

This allows omitting the sample flags from trun, if the default
flags happen to be right for all the samples.
Signed-off-by: 's avatarMartin Storsjö <martin@martin.st>
parent 0ce3a0f9
...@@ -2409,6 +2409,12 @@ static int mov_write_mfhd_tag(AVIOContext *pb, MOVMuxContext *mov) ...@@ -2409,6 +2409,12 @@ static int mov_write_mfhd_tag(AVIOContext *pb, MOVMuxContext *mov)
return 0; return 0;
} }
static uint32_t get_sample_flags(MOVTrack *track, MOVIentry *entry)
{
return entry->flags & MOV_SYNC_SAMPLE ? MOV_FRAG_SAMPLE_FLAG_DEPENDS_NO :
(MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES | MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC);
}
static int mov_write_tfhd_tag(AVIOContext *pb, MOVMuxContext *mov, static int mov_write_tfhd_tag(AVIOContext *pb, MOVMuxContext *mov,
MOVTrack *track, int64_t moof_offset) MOVTrack *track, int64_t moof_offset)
{ {
...@@ -2454,6 +2460,11 @@ static int mov_write_tfhd_tag(AVIOContext *pb, MOVMuxContext *mov, ...@@ -2454,6 +2460,11 @@ static int mov_write_tfhd_tag(AVIOContext *pb, MOVMuxContext *mov,
track->default_size = -1; track->default_size = -1;
if (flags & MOV_TFHD_DEFAULT_FLAGS) { if (flags & MOV_TFHD_DEFAULT_FLAGS) {
/* Set the default flags based on the second sample, if available.
* If the first sample is different, that can be signaled via a separate field. */
if (track->entry > 1)
track->default_sample_flags = get_sample_flags(track, &track->cluster[1]);
else
track->default_sample_flags = track->default_sample_flags =
track->enc->codec_type == AVMEDIA_TYPE_VIDEO ? track->enc->codec_type == AVMEDIA_TYPE_VIDEO ?
(MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES | MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC) : (MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES | MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC) :
...@@ -2464,12 +2475,6 @@ static int mov_write_tfhd_tag(AVIOContext *pb, MOVMuxContext *mov, ...@@ -2464,12 +2475,6 @@ static int mov_write_tfhd_tag(AVIOContext *pb, MOVMuxContext *mov,
return update_size(pb, pos); return update_size(pb, pos);
} }
static uint32_t get_sample_flags(MOVTrack *track, MOVIentry *entry)
{
return entry->flags & MOV_SYNC_SAMPLE ? MOV_FRAG_SAMPLE_FLAG_DEPENDS_NO :
(MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES | MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC);
}
static int mov_write_trun_tag(AVIOContext *pb, MOVMuxContext *mov, static int mov_write_trun_tag(AVIOContext *pb, MOVMuxContext *mov,
MOVTrack *track, int moof_size) MOVTrack *track, int moof_size)
{ {
......
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