diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-03-06 22:39:18 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-03-06 22:50:06 +0100 |
commit | 3ce858141309c09294177e63d9a36cd0924dc200 (patch) | |
tree | 5291181945897071a3fa0117e0ad5c878f6af03c /libavformat/mxfdec.c | |
parent | 2265212396c1126ee4b21cc038a2bc7eab16e60a (diff) | |
parent | 5b930092c3afd2ae01f1c8aa7fb405911d6ad416 (diff) |
Merge commit '5b930092c3afd2ae01f1c8aa7fb405911d6ad416'
* commit '5b930092c3afd2ae01f1c8aa7fb405911d6ad416':
mxf: Set audio packets pts
Conflicts:
libavformat/mxfdec.c
See: 83cab07a4c7f8ee1521c49e387b7d86de78d1955
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/mxfdec.c')
-rw-r--r-- | libavformat/mxfdec.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 0e877e3966..50995e1534 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -135,7 +135,7 @@ typedef struct { AVRational edit_rate; int intra_only; uint64_t sample_count; - int64_t original_duration; ///< duration before multiplying st->duration by SampleRate/EditRate + int64_t original_duration; /* st->duration in SampleRate/EditRate units */ } MXFTrack; typedef struct { @@ -1475,7 +1475,8 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) } avpriv_set_pts_info(st, 64, material_track->edit_rate.den, material_track->edit_rate.num); - /* ensure SourceTrack EditRate == MaterialTrack EditRate since only the former is accessible via st->priv_data */ + /* ensure SourceTrack EditRate == MaterialTrack EditRate since only + * the former is accessible via st->priv_data */ source_track->edit_rate = material_track->edit_rate; PRINT_KEY(mxf->fc, "data definition ul", source_track->sequence->data_definition_ul); @@ -1615,7 +1616,9 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) /* if duration is set, rescale it from EditRate to SampleRate */ if (st->duration != AV_NOPTS_VALUE) - st->duration = av_rescale_q(st->duration, av_inv_q(material_track->edit_rate), st->time_base); + st->duration = av_rescale_q(st->duration, + av_inv_q(material_track->edit_rate), + st->time_base); /* TODO: implement AV_CODEC_ID_RAWAUDIO */ if (st->codec->codec_id == AV_CODEC_ID_PCM_S16LE) { @@ -2230,7 +2233,8 @@ static int64_t mxf_set_current_edit_unit(MXFContext *mxf, int64_t current_offset return next_ofs; } -static int mxf_compute_sample_count(MXFContext *mxf, int stream_index, uint64_t *sample_count) +static int mxf_compute_sample_count(MXFContext *mxf, int stream_index, + uint64_t *sample_count) { int i, total = 0, size = 0; AVStream *st = mxf->fc->streams[stream_index]; @@ -2242,13 +2246,16 @@ static int mxf_compute_sample_count(MXFContext *mxf, int stream_index, uint64_t if ((sample_rate.num / sample_rate.den) == 48000) spf = ff_mxf_get_samples_per_frame(mxf->fc, time_base); if (!spf) { - int remainder = (sample_rate.num * time_base.num) % (time_base.den * sample_rate.den); + int remainder = (sample_rate.num * time_base.num) % + (time_base.den * sample_rate.den); *sample_count = av_q2d(av_mul_q((AVRational){mxf->current_edit_unit, 1}, av_mul_q(sample_rate, time_base))); if (remainder) av_log(mxf->fc, AV_LOG_WARNING, - "seeking detected on stream #%d with time base (%d/%d) and sample rate (%d/%d), audio pts won't be accurate.\n", - stream_index, time_base.num, time_base.den, sample_rate.num, sample_rate.den); + "seeking detected on stream #%d with time base (%d/%d) and " + "sample rate (%d/%d), audio pts won't be accurate.\n", + stream_index, time_base.num, time_base.den, + sample_rate.num, sample_rate.den); return 0; } @@ -2267,15 +2274,19 @@ static int mxf_compute_sample_count(MXFContext *mxf, int stream_index, uint64_t return 0; } -static int mxf_set_audio_pts(MXFContext *mxf, AVCodecContext *codec, AVPacket *pkt) +static int mxf_set_audio_pts(MXFContext *mxf, AVCodecContext *codec, + AVPacket *pkt) { MXFTrack *track = mxf->fc->streams[pkt->stream_index]->priv_data; + int64_t bits_per_sample = av_get_bits_per_sample(codec->codec_id); + pkt->pts = track->sample_count; + if ( codec->channels <= 0 - || av_get_bits_per_sample(codec->codec_id) <= 0 - || codec->channels * (int64_t)av_get_bits_per_sample(codec->codec_id) < 8) + || bits_per_sample <= 0 + || codec->channels * (int64_t)bits_per_sample < 8) return AVERROR(EINVAL); - track->sample_count += pkt->size / (codec->channels * (int64_t)av_get_bits_per_sample(codec->codec_id) / 8); + track->sample_count += pkt->size / (codec->channels * (int64_t)bits_per_sample / 8); return 0; } @@ -2344,8 +2355,10 @@ static int mxf_read_packet_old(AVFormatContext *s, AVPacket *pkt) pkt->pos = klv.offset; codec = s->streams[index]->codec; + if (codec->codec_type == AVMEDIA_TYPE_VIDEO && next_ofs >= 0) { - /* mxf->current_edit_unit good - see if we have an index table to derive timestamps from */ + /* mxf->current_edit_unit good - see if we have an + * index table to derive timestamps from */ MXFIndexTable *t = &mxf->index_tables[0]; if (mxf->nb_index_tables >= 1 && mxf->current_edit_unit < t->nb_ptses) { @@ -2527,7 +2540,8 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti /* if audio then truncate sample_time to EditRate */ if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) - sample_time = av_rescale_q(sample_time, st->time_base, av_inv_q(source_track->edit_rate)); + sample_time = av_rescale_q(sample_time, st->time_base, + av_inv_q(source_track->edit_rate)); if (mxf->nb_index_tables <= 0) { if (!s->bit_rate) |