mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-26 01:02:33 +00:00
avformat/mxfdec: compute sample_count after seek from index for audio streams
This fixes audio timestamps if the audio streams are not frame wrapped with the video. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
0827c78e98
commit
e8e1c22f21
@ -3055,6 +3055,42 @@ fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static MXFIndexTable *mxf_find_index_table(MXFContext *mxf, int index_sid)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < mxf->nb_index_tables; i++)
|
||||
if (mxf->index_tables[i].index_sid == index_sid)
|
||||
return &mxf->index_tables[i];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Get the edit unit of the next packet from current_offset in a track. The returned edit unit can be original_duration as well! */
|
||||
static int mxf_get_next_track_edit_unit(MXFContext *mxf, MXFTrack *track, int64_t current_offset, int64_t *edit_unit_out)
|
||||
{
|
||||
int64_t a, b, m, offset;
|
||||
MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
|
||||
|
||||
if (!t || track->original_duration <= 0)
|
||||
return -1;
|
||||
|
||||
a = -1;
|
||||
b = track->original_duration;
|
||||
|
||||
while (b - a > 1) {
|
||||
m = (a + b) >> 1;
|
||||
if (mxf_edit_unit_absolute_offset(mxf, t, m, NULL, &offset, 0) < 0)
|
||||
return -1;
|
||||
if (offset < current_offset)
|
||||
a = m;
|
||||
else
|
||||
b = m;
|
||||
}
|
||||
|
||||
*edit_unit_out = b;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets mxf->current_edit_unit based on what offset we're currently at.
|
||||
* @return next_ofs if OK, <0 on error
|
||||
@ -3454,13 +3490,19 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti
|
||||
for (i = 0; i < s->nb_streams; i++) {
|
||||
AVStream *cur_st = s->streams[i];
|
||||
MXFTrack *cur_track = cur_st->priv_data;
|
||||
uint64_t current_sample_count = 0;
|
||||
if (cur_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
ret = mxf_compute_sample_count(mxf, i, ¤t_sample_count);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
cur_track->sample_count = current_sample_count;
|
||||
int64_t track_edit_unit;
|
||||
if (st != cur_st && mxf_get_next_track_edit_unit(mxf, cur_track, seekpos, &track_edit_unit) >= 0) {
|
||||
cur_track->sample_count = av_rescale_q(track_edit_unit,
|
||||
av_inv_q(cur_track->edit_rate),
|
||||
cur_st->time_base);
|
||||
} else {
|
||||
uint64_t current_sample_count = 0;
|
||||
ret = mxf_compute_sample_count(mxf, i, ¤t_sample_count);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
cur_track->sample_count = current_sample_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user