diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-02-28 03:38:58 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-02-28 03:38:58 +0100 |
commit | e3822886ebb3ae97bdae9be264d891f1d35c960b (patch) | |
tree | 0debfb9843f9a8b56454a1bbe9b679827e9c2615 /libavformat/movenc.c | |
parent | f1808e304834304122ebce9325eb997a673a9dc2 (diff) | |
parent | d10319d87f7f408dc69e1540498e87e2860e945d (diff) | |
download | ffmpeg-e3822886ebb3ae97bdae9be264d891f1d35c960b.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
avcodec_default_reget_buffer(): fix compilation in DEBUG mode
fate: Overhaul WavPack coverage
h264: fix mmxext chroma deblock to use correct TC values.
flvdec: Remove the now redundant check for known broken metadata creator
flvdec: Validate index entries added from metadata while reading
rtsp: Handle requests from server to client
movenc: use timestamps instead of frame_size for samples-per-packet
movenc: use the first cluster duration as the tfhd default duration
movenc: factorize calculation of cluster duration into a separate function
doc/APIchanges: fill in missing dates and hashes.
lavc: reorder AVCodecContext fields.
lavc: reorder AVFrame fields.
Conflicts:
doc/APIchanges
libavcodec/avcodec.h
libavformat/flvdec.c
libavformat/movenc.c
tests/fate/lossless-audio.mak
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/movenc.c')
-rw-r--r-- | libavformat/movenc.c | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 472281957b..7f970be35f 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -565,6 +565,42 @@ static int mov_get_lpcm_flags(enum CodecID codec_id) } } +static int get_cluster_duration(MOVTrack *track, int cluster_idx) +{ + int64_t next_dts; + + if (cluster_idx >= track->entry) + return 0; + + if (cluster_idx + 1 == track->entry) + next_dts = track->track_duration + track->start_dts; + else + next_dts = track->cluster[cluster_idx + 1].dts; + + return next_dts - track->cluster[cluster_idx].dts; +} + +static int get_samples_per_packet(MOVTrack *track) +{ + int i, first_duration; + +// return track->enc->frame_size; + + /* use 1 for raw PCM */ + if (!track->audio_vbr) + return 1; + + /* check to see if duration is constant for all clusters */ + if (!track->entry) + return 0; + first_duration = get_cluster_duration(track, 0); + for (i = 1; i < track->entry; i++) { + if (get_cluster_duration(track, i) != first_duration) + return 0; + } + return first_duration; +} + static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) { int64_t pos = avio_tell(pb); @@ -607,7 +643,7 @@ static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) avio_wb32(pb, av_get_bits_per_sample(track->enc->codec_id)); avio_wb32(pb, mov_get_lpcm_flags(track->enc->codec_id)); avio_wb32(pb, track->sample_size); - avio_wb32(pb, track->enc->frame_size); + avio_wb32(pb, get_samples_per_packet(track)); } else { if (track->mode == MODE_MOV) { avio_wb16(pb, track->enc->channels); @@ -1143,9 +1179,7 @@ static int mov_write_stts_tag(AVIOContext *pb, MOVTrack *track) av_malloc(track->entry * sizeof(*stts_entries)) : /* worst case */ NULL; for (i=0; i<track->entry; i++) { - int64_t duration = i + 1 == track->entry ? - track->track_duration - track->cluster[i].dts + track->start_dts : /* readjusting */ - track->cluster[i+1].dts - track->cluster[i].dts; + int duration = get_cluster_duration(track, i); if (i && duration == stts_entries[entries].duration) { stts_entries[entries].count++; /* compress */ } else { @@ -2262,7 +2296,7 @@ static int mov_write_tfhd_tag(AVIOContext *pb, MOVTrack *track, if (flags & MOV_TFHD_BASE_DATA_OFFSET) avio_wb64(pb, moof_offset); if (flags & MOV_TFHD_DEFAULT_DURATION) { - track->default_duration = track->audio_vbr ? track->enc->frame_size : 1; + track->default_duration = get_cluster_duration(track, 0); avio_wb32(pb, track->default_duration); } if (flags & MOV_TFHD_DEFAULT_SIZE) { @@ -2295,10 +2329,7 @@ static int mov_write_trun_tag(AVIOContext *pb, MOVTrack *track) int i; for (i = 0; i < track->entry; i++) { - int64_t duration = i + 1 == track->entry ? - track->track_duration - track->cluster[i].dts + track->start_dts : - track->cluster[i + 1].dts - track->cluster[i].dts; - if (duration != track->default_duration) + if (get_cluster_duration(track, i) != track->default_duration) flags |= MOV_TRUN_SAMPLE_DURATION; if (track->cluster[i].size != track->default_size) flags |= MOV_TRUN_SAMPLE_SIZE; @@ -2322,11 +2353,8 @@ static int mov_write_trun_tag(AVIOContext *pb, MOVTrack *track) avio_wb32(pb, get_sample_flags(track, &track->cluster[0])); for (i = 0; i < track->entry; i++) { - int64_t duration = i + 1 == track->entry ? - track->track_duration - track->cluster[i].dts + track->start_dts : - track->cluster[i + 1].dts - track->cluster[i].dts; if (flags & MOV_TRUN_SAMPLE_DURATION) - avio_wb32(pb, duration); + avio_wb32(pb, get_cluster_duration(track, i)); if (flags & MOV_TRUN_SAMPLE_SIZE) avio_wb32(pb, track->cluster[i].size); if (flags & MOV_TRUN_SAMPLE_FLAGS) |