fixing current_sample vs. next_sample mess

Originally committed as revision 5190 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2006-03-21 18:32:58 +00:00
parent 348efc1836
commit 8fcdd831f4
1 changed files with 16 additions and 10 deletions

View File

@ -1693,6 +1693,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
int64_t offset = INT64_MAX; int64_t offset = INT64_MAX;
int64_t best_dts = INT64_MAX; int64_t best_dts = INT64_MAX;
int i, a, b, m; int i, a, b, m;
int next_sample= -99;
int size; int size;
int idx; int idx;
size = 0x0FFFFFFF; size = 0x0FFFFFFF;
@ -1708,7 +1709,8 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
//size = (sc->sample_size)?sc->sample_size:sc->sample_sizes[sc->current_sample]; //size = (sc->sample_size)?sc->sample_size:sc->sample_sizes[sc->current_sample];
size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample]; size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample];
sc->current_sample++; next_sample= sc->current_sample+1;
sc->left_in_chunk--; sc->left_in_chunk--;
if (sc->left_in_chunk <= 0) if (sc->left_in_chunk <= 0)
@ -1734,13 +1736,13 @@ again:
int time= msc->sample_to_time_time; int time= msc->sample_to_time_time;
int duration = msc->stts_data[index].duration; int duration = msc->stts_data[index].duration;
int count = msc->stts_data[index].count; int count = msc->stts_data[index].count;
if (sample + count < msc->current_sample) { if (sample + count <= msc->current_sample) {
sample += count; sample += count;
time += count*duration; time += count*duration;
index ++; index ++;
duration = msc->stts_data[index].duration; duration = msc->stts_data[index].duration;
} }
dts = time + (msc->current_sample-1 - sample) * (int64_t)duration; dts = time + (msc->current_sample - sample) * (int64_t)duration;
dts = av_rescale(dts, AV_TIME_BASE, msc->time_scale); dts = av_rescale(dts, AV_TIME_BASE, msc->time_scale);
dprintf("stream: %d dts: %"PRId64" best_dts: %"PRId64" offset: %"PRId64"\n", i, dts, best_dts, offset); dprintf("stream: %d dts: %"PRId64" best_dts: %"PRId64" offset: %"PRId64"\n", i, dts, best_dts, offset);
if(dts < best_dts){ if(dts < best_dts){
@ -1817,10 +1819,11 @@ again:
size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample]; size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample];
} }
sc->current_sample++; next_sample= sc->current_sample+1;
}else if(idx + 1 < sc->sample_to_chunk_sz){ }else if(idx < sc->sample_to_chunk_sz){
sc->current_sample += sc->sample_to_chunk[idx].count; next_sample= sc->current_sample + sc->sample_to_chunk[idx].count;
} }else
next_sample= sc->current_sample;
readchunk: readchunk:
dprintf("chunk: %"PRId64" -> %"PRId64" (%i)\n", offset, offset + size, size); dprintf("chunk: %"PRId64" -> %"PRId64" (%i)\n", offset, offset + size, size);
@ -1864,19 +1867,19 @@ readchunk:
uint64_t dts, pts; uint64_t dts, pts;
unsigned int duration = sc->stts_data[sc->sample_to_time_index].duration; unsigned int duration = sc->stts_data[sc->sample_to_time_index].duration;
count = sc->stts_data[sc->sample_to_time_index].count; count = sc->stts_data[sc->sample_to_time_index].count;
if ((sc->sample_to_time_sample + count) < sc->current_sample) { if ((sc->sample_to_time_sample + count) <= sc->current_sample) {
sc->sample_to_time_sample += count; sc->sample_to_time_sample += count;
sc->sample_to_time_time += count*duration; sc->sample_to_time_time += count*duration;
sc->sample_to_time_index ++; sc->sample_to_time_index ++;
duration = sc->stts_data[sc->sample_to_time_index].duration; duration = sc->stts_data[sc->sample_to_time_index].duration;
} }
dts = sc->sample_to_time_time + (sc->current_sample-1 - sc->sample_to_time_sample) * (int64_t)duration; dts = sc->sample_to_time_time + (sc->current_sample - sc->sample_to_time_sample) * (int64_t)duration;
/* find the corresponding pts */ /* find the corresponding pts */
if (sc->sample_to_ctime_index < sc->ctts_count) { if (sc->sample_to_ctime_index < sc->ctts_count) {
int duration = sc->ctts_data[sc->sample_to_ctime_index].duration; int duration = sc->ctts_data[sc->sample_to_ctime_index].duration;
int count = sc->ctts_data[sc->sample_to_ctime_index].count; int count = sc->ctts_data[sc->sample_to_ctime_index].count;
if ((sc->sample_to_ctime_sample + count) < sc->current_sample) { if ((sc->sample_to_ctime_sample + count) <= sc->current_sample) {
sc->sample_to_ctime_sample += count; sc->sample_to_ctime_sample += count;
sc->sample_to_ctime_index ++; sc->sample_to_ctime_index ++;
duration = sc->ctts_data[sc->sample_to_ctime_index].duration; duration = sc->ctts_data[sc->sample_to_ctime_index].duration;
@ -1901,6 +1904,9 @@ readchunk:
, duration); , duration);
} }
assert(next_sample>=0);
sc->current_sample= next_sample;
return 0; return 0;
} }