avformat/mov: Populate packet duration using stts atom instead of guessing

Fixes tickets #7855 and #11312.

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
Darren Mo 2024-11-20 22:27:02 -03:00 committed by James Almer
parent b328bf8f7e
commit 865c73c86f
11 changed files with 182 additions and 30 deletions

View file

@ -174,6 +174,7 @@ typedef struct MOVStreamContext {
unsigned int chunk_count; unsigned int chunk_count;
int64_t *chunk_offsets; int64_t *chunk_offsets;
unsigned int stts_count; unsigned int stts_count;
unsigned int stts_allocated_size;
MOVStts *stts_data; MOVStts *stts_data;
unsigned int sdtp_count; unsigned int sdtp_count;
uint8_t *sdtp_data; uint8_t *sdtp_data;
@ -188,6 +189,8 @@ typedef struct MOVStreamContext {
unsigned *stps_data; ///< partial sync sample for mpeg-2 open gop unsigned *stps_data; ///< partial sync sample for mpeg-2 open gop
MOVElst *elst_data; MOVElst *elst_data;
unsigned int elst_count; unsigned int elst_count;
int stts_index;
int stts_sample;
int ctts_index; int ctts_index;
int ctts_sample; int ctts_sample;
unsigned int sample_size; ///< may contain value calculated from stsd or value from stsz atom unsigned int sample_size; ///< may contain value calculated from stsd or value from stsz atom

View file

@ -3518,7 +3518,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{ {
AVStream *st; AVStream *st;
MOVStreamContext *sc; MOVStreamContext *sc;
unsigned int i, entries, alloc_size = 0; unsigned int i, entries;
int64_t duration = 0; int64_t duration = 0;
int64_t total_sample_count = 0; int64_t total_sample_count = 0;
int64_t current_dts = 0; int64_t current_dts = 0;
@ -3552,7 +3552,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
unsigned int sample_duration; unsigned int sample_duration;
unsigned int sample_count; unsigned int sample_count;
unsigned int min_entries = FFMIN(FFMAX(i + 1, 1024 * 1024), entries); unsigned int min_entries = FFMIN(FFMAX(i + 1, 1024 * 1024), entries);
MOVStts *stts_data = av_fast_realloc(sc->stts_data, &alloc_size, MOVStts *stts_data = av_fast_realloc(sc->stts_data, &sc->stts_allocated_size,
min_entries * sizeof(*sc->stts_data)); min_entries * sizeof(*sc->stts_data));
if (!stts_data) { if (!stts_data) {
av_freep(&sc->stts_data); av_freep(&sc->stts_data);
@ -3916,11 +3916,15 @@ static int get_edit_list_entry(MOVContext *mov,
static int find_prev_closest_index(AVStream *st, static int find_prev_closest_index(AVStream *st,
AVIndexEntry *e_old, AVIndexEntry *e_old,
int nb_old, int nb_old,
MOVStts* stts_data,
int64_t stts_count,
MOVCtts* ctts_data, MOVCtts* ctts_data,
int64_t ctts_count, int64_t ctts_count,
int64_t timestamp_pts, int64_t timestamp_pts,
int flag, int flag,
int64_t* index, int64_t* index,
int64_t* stts_index,
int64_t* stts_sample,
int64_t* ctts_index, int64_t* ctts_index,
int64_t* ctts_sample) int64_t* ctts_sample)
{ {
@ -3963,6 +3967,15 @@ static int find_prev_closest_index(AVStream *st,
// Find out the ctts_index for the found frame. // Find out the ctts_index for the found frame.
*ctts_index = 0; *ctts_index = 0;
*ctts_sample = 0; *ctts_sample = 0;
if (stts_data) {
av_assert0(stts_index);
av_assert0(stts_sample);
*stts_index = 0;
*stts_sample = 0;
}
for (index_ctts_count = 0; index_ctts_count < *index; index_ctts_count++) { for (index_ctts_count = 0; index_ctts_count < *index; index_ctts_count++) {
if (*ctts_index < ctts_count) { if (*ctts_index < ctts_count) {
(*ctts_sample)++; (*ctts_sample)++;
@ -3971,6 +3984,13 @@ static int find_prev_closest_index(AVStream *st,
*ctts_sample = 0; *ctts_sample = 0;
} }
} }
if (stts_data && *stts_index < stts_count) {
(*stts_sample)++;
if (stts_data[*stts_index].count == *stts_sample) {
(*stts_index)++;
*stts_sample = 0;
}
}
} }
while (*index >= 0 && (*ctts_index) >= 0 && (*ctts_index) < ctts_count) { while (*index >= 0 && (*ctts_index) >= 0 && (*ctts_index) < ctts_count) {
@ -3990,6 +4010,16 @@ static int find_prev_closest_index(AVStream *st,
} else { } else {
(*ctts_sample)--; (*ctts_sample)--;
} }
if (stts_data) {
if (*stts_sample == 0) {
(*stts_index)--;
if (*stts_index >= 0) {
*stts_sample = stts_data[*stts_index].count - 1;
}
} else {
(*stts_sample)--;
}
}
} }
} }
@ -4063,6 +4093,33 @@ static void fix_index_entry_timestamps(AVStream* st, int end_index, int64_t end_
} }
} }
static int64_t add_stts_entry(MOVStts** stts_data, unsigned int* stts_count, unsigned int* allocated_size,
int count, int duration)
{
MOVStts *stts_buf_new;
const size_t min_size_needed = (*stts_count + 1) * sizeof(MOVStts);
const size_t requested_size =
min_size_needed > *allocated_size ?
FFMAX(min_size_needed, 2 * (*allocated_size)) :
min_size_needed;
if ((unsigned)(*stts_count) >= UINT_MAX / sizeof(MOVStts) - 1)
return -1;
stts_buf_new = av_fast_realloc(*stts_data, allocated_size, requested_size);
if (!stts_buf_new)
return -1;
*stts_data = stts_buf_new;
stts_buf_new[*stts_count].count = count;
stts_buf_new[*stts_count].duration = duration;
*stts_count = (*stts_count) + 1;
return *stts_count;
}
/** /**
* Append a new ctts entry to ctts_data. * Append a new ctts entry to ctts_data.
* Returns the new ctts_count if successful, else returns -1. * Returns the new ctts_count if successful, else returns -1.
@ -4211,6 +4268,10 @@ static void mov_fix_index(MOVContext *mov, AVStream *st)
int nb_old = sti->nb_index_entries; int nb_old = sti->nb_index_entries;
const AVIndexEntry *e_old_end = e_old + nb_old; const AVIndexEntry *e_old_end = e_old + nb_old;
const AVIndexEntry *current = NULL; const AVIndexEntry *current = NULL;
MOVStts *stts_data_old = msc->stts_data;
int64_t stts_index_old = 0;
int64_t stts_sample_old = 0;
int64_t stts_count_old = msc->stts_count;
MOVCtts *ctts_data_old = msc->ctts_data; MOVCtts *ctts_data_old = msc->ctts_data;
int64_t ctts_index_old = 0; int64_t ctts_index_old = 0;
int64_t ctts_sample_old = 0; int64_t ctts_sample_old = 0;
@ -4220,6 +4281,7 @@ static void mov_fix_index(MOVContext *mov, AVStream *st)
int64_t frame_duration = 0; int64_t frame_duration = 0;
int64_t edit_list_dts_counter = 0; int64_t edit_list_dts_counter = 0;
int64_t edit_list_dts_entry_end = 0; int64_t edit_list_dts_entry_end = 0;
int64_t edit_list_start_stts_sample = 0;
int64_t edit_list_start_ctts_sample = 0; int64_t edit_list_start_ctts_sample = 0;
int64_t curr_cts; int64_t curr_cts;
int64_t curr_ctts = 0; int64_t curr_ctts = 0;
@ -4256,7 +4318,12 @@ static void mov_fix_index(MOVContext *mov, AVStream *st)
sti->index_entries_allocated_size = 0; sti->index_entries_allocated_size = 0;
sti->nb_index_entries = 0; sti->nb_index_entries = 0;
// Clean ctts fields of MOVStreamContext // Clean time to sample fields of MOVStreamContext
msc->stts_data = NULL;
msc->stts_count = 0;
msc->stts_index = 0;
msc->stts_sample = 0;
msc->stts_allocated_size = 0;
msc->ctts_data = NULL; msc->ctts_data = NULL;
msc->ctts_count = 0; msc->ctts_count = 0;
msc->ctts_index = 0; msc->ctts_index = 0;
@ -4314,23 +4381,26 @@ static void mov_fix_index(MOVContext *mov, AVStream *st)
search_timestamp = FFMAX(search_timestamp - msc->time_scale, e_old[0].timestamp); search_timestamp = FFMAX(search_timestamp - msc->time_scale, e_old[0].timestamp);
} }
if (find_prev_closest_index(st, e_old, nb_old, ctts_data_old, ctts_count_old, search_timestamp, 0, if (find_prev_closest_index(st, e_old, nb_old, stts_data_old, stts_count_old, ctts_data_old, ctts_count_old, search_timestamp, 0,
&index, &ctts_index_old, &ctts_sample_old) < 0) { &index, &stts_index_old, &stts_sample_old, &ctts_index_old, &ctts_sample_old) < 0) {
av_log(mov->fc, AV_LOG_WARNING, av_log(mov->fc, AV_LOG_WARNING,
"st: %d edit list: %"PRId64" Missing key frame while searching for timestamp: %"PRId64"\n", "st: %d edit list: %"PRId64" Missing key frame while searching for timestamp: %"PRId64"\n",
st->index, edit_list_index, search_timestamp); st->index, edit_list_index, search_timestamp);
if (find_prev_closest_index(st, e_old, nb_old, ctts_data_old, ctts_count_old, search_timestamp, AVSEEK_FLAG_ANY, if (find_prev_closest_index(st, e_old, nb_old, stts_data_old, stts_count_old, ctts_data_old, ctts_count_old, search_timestamp, AVSEEK_FLAG_ANY,
&index, &ctts_index_old, &ctts_sample_old) < 0) { &index, &stts_index_old, &stts_sample_old, &ctts_index_old, &ctts_sample_old) < 0) {
av_log(mov->fc, AV_LOG_WARNING, av_log(mov->fc, AV_LOG_WARNING,
"st: %d edit list %"PRId64" Cannot find an index entry before timestamp: %"PRId64".\n", "st: %d edit list %"PRId64" Cannot find an index entry before timestamp: %"PRId64".\n",
st->index, edit_list_index, search_timestamp); st->index, edit_list_index, search_timestamp);
index = 0; index = 0;
stts_index_old = 0;
stts_sample_old = 0;
ctts_index_old = 0; ctts_index_old = 0;
ctts_sample_old = 0; ctts_sample_old = 0;
} }
} }
current = e_old + index; current = e_old + index;
edit_list_start_ctts_sample = ctts_sample_old; edit_list_start_ctts_sample = ctts_sample_old;
edit_list_start_stts_sample = stts_sample_old;
// Iterate over index and arrange it according to edit list // Iterate over index and arrange it according to edit list
edit_list_start_encountered = 0; edit_list_start_encountered = 0;
@ -4346,6 +4416,24 @@ static void mov_fix_index(MOVContext *mov, AVStream *st)
curr_cts = current->timestamp + msc->dts_shift; curr_cts = current->timestamp + msc->dts_shift;
curr_ctts = 0; curr_ctts = 0;
if (stts_data_old && stts_index_old < stts_count_old) {
stts_sample_old++;
if (stts_sample_old == stts_data_old[stts_index_old].count) {
if (add_stts_entry(&msc->stts_data, &msc->stts_count,
&msc->stts_allocated_size,
stts_data_old[stts_index_old].count - edit_list_start_stts_sample,
stts_data_old[stts_index_old].duration) == -1) {
av_log(mov->fc, AV_LOG_ERROR, "Cannot add STTS entry %"PRId64" - {%"PRId64", %d}\n",
stts_index_old,
stts_data_old[stts_index_old].count - edit_list_start_stts_sample,
stts_data_old[stts_index_old].duration);
break;
}
stts_index_old++;
stts_sample_old = 0;
edit_list_start_stts_sample = 0;
}
}
if (ctts_data_old && ctts_index_old < ctts_count_old) { if (ctts_data_old && ctts_index_old < ctts_count_old) {
curr_ctts = ctts_data_old[ctts_index_old].offset; curr_ctts = ctts_data_old[ctts_index_old].offset;
av_log(mov->fc, AV_LOG_TRACE, "stts: %"PRId64" ctts: %"PRId64", ctts_index: %"PRId64", ctts_count: %"PRId64"\n", av_log(mov->fc, AV_LOG_TRACE, "stts: %"PRId64" ctts: %"PRId64", ctts_index: %"PRId64", ctts_count: %"PRId64"\n",
@ -4460,6 +4548,16 @@ static void mov_fix_index(MOVContext *mov, AVStream *st)
continue; continue;
} }
if (ctts_sample_old != 0) { if (ctts_sample_old != 0) {
if (stts_data_old &&
add_stts_entry(&msc->stts_data, &msc->stts_count,
&msc->stts_allocated_size,
stts_sample_old - edit_list_start_stts_sample,
stts_data_old[stts_index_old].duration) == -1) {
av_log(mov->fc, AV_LOG_ERROR, "Cannot add STTS entry %"PRId64" - {%"PRId64", %d}\n",
stts_index_old, stts_sample_old - edit_list_start_stts_sample,
stts_data_old[stts_index_old].duration);
break;
}
if (add_ctts_entry(&msc->ctts_data, &msc->ctts_count, if (add_ctts_entry(&msc->ctts_data, &msc->ctts_count,
&msc->ctts_allocated_size, &msc->ctts_allocated_size,
ctts_sample_old - edit_list_start_ctts_sample, ctts_sample_old - edit_list_start_ctts_sample,
@ -4497,6 +4595,7 @@ static void mov_fix_index(MOVContext *mov, AVStream *st)
// Free the old index and the old CTTS structures // Free the old index and the old CTTS structures
av_free(e_old); av_free(e_old);
av_free(stts_data_old);
av_free(ctts_data_old); av_free(ctts_data_old);
av_freep(&frame_duration_buffer); av_freep(&frame_duration_buffer);
@ -5213,7 +5312,6 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
av_freep(&sc->chunk_offsets); av_freep(&sc->chunk_offsets);
av_freep(&sc->sample_sizes); av_freep(&sc->sample_sizes);
av_freep(&sc->keyframes); av_freep(&sc->keyframes);
av_freep(&sc->stts_data);
av_freep(&sc->stps_data); av_freep(&sc->stps_data);
av_freep(&sc->elst_data); av_freep(&sc->elst_data);
av_freep(&sc->rap_group); av_freep(&sc->rap_group);
@ -5686,6 +5784,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
AVStream *st = NULL; AVStream *st = NULL;
FFStream *sti = NULL; FFStream *sti = NULL;
MOVStreamContext *sc; MOVStreamContext *sc;
MOVStts *stts_data;
MOVCtts *ctts_data; MOVCtts *ctts_data;
uint64_t offset; uint64_t offset;
int64_t dts, pts = AV_NOPTS_VALUE; int64_t dts, pts = AV_NOPTS_VALUE;
@ -5695,7 +5794,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int64_t prev_dts = AV_NOPTS_VALUE; int64_t prev_dts = AV_NOPTS_VALUE;
int next_frag_index = -1, index_entry_pos; int next_frag_index = -1, index_entry_pos;
size_t requested_size; size_t requested_size;
size_t old_ctts_allocated_size; size_t old_allocated_size;
AVIndexEntry *new_entries; AVIndexEntry *new_entries;
MOVFragmentStreamInfo * frag_stream_info; MOVFragmentStreamInfo * frag_stream_info;
@ -5816,7 +5915,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sti->index_entries= new_entries; sti->index_entries= new_entries;
requested_size = (sti->nb_index_entries + entries) * sizeof(*sc->ctts_data); requested_size = (sti->nb_index_entries + entries) * sizeof(*sc->ctts_data);
old_ctts_allocated_size = sc->ctts_allocated_size; old_allocated_size = sc->ctts_allocated_size;
ctts_data = av_fast_realloc(sc->ctts_data, &sc->ctts_allocated_size, ctts_data = av_fast_realloc(sc->ctts_data, &sc->ctts_allocated_size,
requested_size); requested_size);
if (!ctts_data) if (!ctts_data)
@ -5826,8 +5925,20 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
// In case there were samples without ctts entries, ensure they get // In case there were samples without ctts entries, ensure they get
// zero valued entries. This ensures clips which mix boxes with and // zero valued entries. This ensures clips which mix boxes with and
// without ctts entries don't pickup uninitialized data. // without ctts entries don't pickup uninitialized data.
memset((uint8_t*)(sc->ctts_data) + old_ctts_allocated_size, 0, memset((uint8_t*)(sc->ctts_data) + old_allocated_size, 0,
sc->ctts_allocated_size - old_ctts_allocated_size); sc->ctts_allocated_size - old_allocated_size);
requested_size = (sti->nb_index_entries + entries) * sizeof(*sc->stts_data);
old_allocated_size = sc->stts_allocated_size;
stts_data = av_fast_realloc(sc->stts_data, &sc->stts_allocated_size,
requested_size);
if (!stts_data)
return AVERROR(ENOMEM);
sc->stts_data = stts_data;
// See the comment for ctts above.
memset((uint8_t*)(sc->stts_data) + old_allocated_size, 0,
sc->stts_allocated_size - old_allocated_size);
if (index_entry_pos < sti->nb_index_entries) { if (index_entry_pos < sti->nb_index_entries) {
// Make hole in index_entries and ctts_data for new samples // Make hole in index_entries and ctts_data for new samples
@ -5838,6 +5949,9 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
memmove(sc->ctts_data + index_entry_pos + entries, memmove(sc->ctts_data + index_entry_pos + entries,
sc->ctts_data + index_entry_pos, sc->ctts_data + index_entry_pos,
sizeof(*sc->ctts_data) * (sc->ctts_count - index_entry_pos)); sizeof(*sc->ctts_data) * (sc->ctts_count - index_entry_pos));
memmove(sc->stts_data + index_entry_pos + entries,
sc->stts_data + index_entry_pos,
sizeof(*sc->stts_data) * (sc->stts_count - index_entry_pos));
if (index_entry_pos < sc->current_sample) { if (index_entry_pos < sc->current_sample) {
sc->current_sample += entries; sc->current_sample += entries;
} }
@ -5845,6 +5959,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sti->nb_index_entries += entries; sti->nb_index_entries += entries;
sc->ctts_count = sti->nb_index_entries; sc->ctts_count = sti->nb_index_entries;
sc->stts_count = sti->nb_index_entries;
// Record the index_entry position in frag_index of this fragment // Record the index_entry position in frag_index of this fragment
if (frag_stream_info) { if (frag_stream_info) {
@ -5911,6 +6026,8 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sc->ctts_data[index_entry_pos].count = 1; sc->ctts_data[index_entry_pos].count = 1;
sc->ctts_data[index_entry_pos].offset = ctts_duration; sc->ctts_data[index_entry_pos].offset = ctts_duration;
sc->stts_data[index_entry_pos].count = 1;
sc->stts_data[index_entry_pos].duration = sample_duration;
index_entry_pos++; index_entry_pos++;
av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", " av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
@ -5946,9 +6063,14 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sc->ctts_data + index_entry_pos + gap, sc->ctts_data + index_entry_pos + gap,
sizeof(*sc->ctts_data) * sizeof(*sc->ctts_data) *
(sc->ctts_count - (index_entry_pos + gap))); (sc->ctts_count - (index_entry_pos + gap)));
memmove(sc->stts_data + index_entry_pos,
sc->stts_data + index_entry_pos + gap,
sizeof(*sc->stts_data) *
(sc->stts_count - (index_entry_pos + gap)));
sti->nb_index_entries -= gap; sti->nb_index_entries -= gap;
sc->ctts_count -= gap; sc->ctts_count -= gap;
sc->stts_count -= gap;
if (index_entry_pos < sc->current_sample) { if (index_entry_pos < sc->current_sample) {
sc->current_sample -= gap; sc->current_sample -= gap;
} }
@ -10720,6 +10842,17 @@ static int mov_finalize_packet(AVFormatContext *s, AVStream *st, AVIndexEntry *s
if (sample->flags & AVINDEX_DISCARD_FRAME) { if (sample->flags & AVINDEX_DISCARD_FRAME) {
pkt->flags |= AV_PKT_FLAG_DISCARD; pkt->flags |= AV_PKT_FLAG_DISCARD;
} }
if (sc->stts_data && sc->stts_index < sc->stts_count) {
pkt->duration = sc->stts_data[sc->stts_index].duration;
/* update stts context */
sc->stts_sample++;
if (sc->stts_index < sc->stts_count &&
sc->stts_data[sc->stts_index].count == sc->stts_sample) {
sc->stts_index++;
sc->stts_sample = 0;
}
}
if (sc->ctts_data && sc->ctts_index < sc->ctts_count) { if (sc->ctts_data && sc->ctts_index < sc->ctts_count) {
pkt->pts = av_sat_add64(pkt->dts, av_sat_add64(sc->dts_shift, sc->ctts_data[sc->ctts_index].offset)); pkt->pts = av_sat_add64(pkt->dts, av_sat_add64(sc->dts_shift, sc->ctts_data[sc->ctts_index].offset));
@ -10731,11 +10864,12 @@ static int mov_finalize_packet(AVFormatContext *s, AVStream *st, AVIndexEntry *s
sc->ctts_sample = 0; sc->ctts_sample = 0;
} }
} else { } else {
if (pkt->duration == 0) {
int64_t next_dts = (sc->current_sample < ffstream(st)->nb_index_entries) ? int64_t next_dts = (sc->current_sample < ffstream(st)->nb_index_entries) ?
ffstream(st)->index_entries[sc->current_sample].timestamp : st->duration; ffstream(st)->index_entries[sc->current_sample].timestamp : st->duration;
if (next_dts >= pkt->dts) if (next_dts >= pkt->dts)
pkt->duration = next_dts - pkt->dts; pkt->duration = next_dts - pkt->dts;
}
pkt->pts = pkt->dts; pkt->pts = pkt->dts;
} }
@ -11031,6 +11165,19 @@ static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp,
mov_current_sample_set(sc, sample); mov_current_sample_set(sc, sample);
av_log(s, AV_LOG_TRACE, "stream %d, found sample %d\n", st->index, sc->current_sample); av_log(s, AV_LOG_TRACE, "stream %d, found sample %d\n", st->index, sc->current_sample);
/* adjust stts index */
if (sc->stts_data) {
time_sample = 0;
for (i = 0; i < sc->stts_count; i++) {
int next = time_sample + sc->stts_data[i].count;
if (next > sc->current_sample) {
sc->stts_index = i;
sc->stts_sample = sc->current_sample - time_sample;
break;
}
time_sample = next;
}
}
/* adjust ctts index */ /* adjust ctts index */
if (sc->ctts_data) { if (sc->ctts_data) {
time_sample = 0; time_sample = 0;

View file

@ -1,5 +1,5 @@
ca4068319c6586de757c1f6a592b31e5 *tests/data/fate/copy-trac236.mov 3e3497985d54991e09f82ca3dd7eda79 *tests/data/fate/copy-trac236.mov
630918 tests/data/fate/copy-trac236.mov 630910 tests/data/fate/copy-trac236.mov
#tb 0: 100/2997 #tb 0: 100/2997
#media_type 0: video #media_type 0: video
#codec_id 0: rawvideo #codec_id 0: rawvideo

View file

@ -91,3 +91,4 @@
0, 85, 85, 1, 30576, 0xd4150aad 0, 85, 85, 1, 30576, 0xd4150aad
0, 86, 86, 1, 30576, 0xd4150aad 0, 86, 86, 1, 30576, 0xd4150aad
0, 87, 87, 1, 30576, 0xd4150aad 0, 87, 87, 1, 30576, 0xd4150aad
0, 88, 88, 1, 30576, 0xd4150aad

View file

@ -91,3 +91,4 @@
0, 85, 85, 1, 30576, 0xd4150aad 0, 85, 85, 1, 30576, 0xd4150aad
0, 86, 86, 1, 30576, 0xd4150aad 0, 86, 86, 1, 30576, 0xd4150aad
0, 87, 87, 1, 30576, 0xd4150aad 0, 87, 87, 1, 30576, 0xd4150aad
0, 88, 88, 1, 30576, 0xd4150aad

View file

@ -1,5 +1,5 @@
dc213aee944a55af2f41950921fd62d7 *tests/data/fate/filter-meta-4560-rotate0.mov 6cd6b45a88881e85dfe7ad9582ffbeff *tests/data/fate/filter-meta-4560-rotate0.mov
347433 tests/data/fate/filter-meta-4560-rotate0.mov 347425 tests/data/fate/filter-meta-4560-rotate0.mov
#tb 0: 1/30 #tb 0: 1/30
#media_type 0: video #media_type 0: video
#codec_id 0: rawvideo #codec_id 0: rawvideo

View file

@ -22,7 +22,7 @@ packet|pts=98304|dts=98304|duration=1024|flags=K__
packet|pts=99328|dts=99328|duration=1024|flags=K__ packet|pts=99328|dts=99328|duration=1024|flags=K__
packet|pts=100352|dts=100352|duration=1024|flags=K__ packet|pts=100352|dts=100352|duration=1024|flags=K__
packet|pts=101376|dts=101376|duration=1024|flags=K__ packet|pts=101376|dts=101376|duration=1024|flags=K__
packet|pts=102400|dts=102400|duration=926|flags=K__ packet|pts=102400|dts=102400|duration=960|flags=K__
stream|nb_read_packets=102 stream|nb_read_packets=102
frame|pts=0|pkt_dts=0|best_effort_timestamp=0|nb_samples=1024 frame|pts=0|pkt_dts=0|best_effort_timestamp=0|nb_samples=1024
frame|pts=1024|pkt_dts=1024|best_effort_timestamp=1024|nb_samples=1024 frame|pts=1024|pkt_dts=1024|best_effort_timestamp=1024|nb_samples=1024

View file

@ -1,5 +1,5 @@
3bd4b07d5af6153516e4c0e66a71c8c9 *tests/data/fate/matroska-dovi-write-config8.matroska 593bb650a937b25b87de3079ee7d1517 *tests/data/fate/matroska-dovi-write-config8.matroska
3600607 tests/data/fate/matroska-dovi-write-config8.matroska 3600617 tests/data/fate/matroska-dovi-write-config8.matroska
#extradata 0: 551, 0xb1ddcd66 #extradata 0: 551, 0xb1ddcd66
#extradata 1: 2, 0x00340022 #extradata 1: 2, 0x00340022
#tb 0: 1/1000 #tb 0: 1/1000

View file

@ -1,12 +1,12 @@
3d9eac5b7551c5d644443a70451c809c *tests/data/fate/matroska-non-rotation-displaymatrix.matroska 7294b73bcb1cd5059b8f413e2a4dab5b *tests/data/fate/matroska-non-rotation-displaymatrix.matroska
7860 tests/data/fate/matroska-non-rotation-displaymatrix.matroska 7866 tests/data/fate/matroska-non-rotation-displaymatrix.matroska
#extradata 0: 34, 0xc1d10b51 #extradata 0: 34, 0xc1d10b51
#tb 0: 1/1000 #tb 0: 1/1000
#media_type 0: video #media_type 0: video
#codec_id 0: h264 #codec_id 0: h264
#dimensions 0: 160x240 #dimensions 0: 160x240
#sar 0: 1/2 #sar 0: 1/2
0, -33, 0, 33, 4133, 0xc48cf152 0, -33, 0, 27, 4133, 0xc48cf152
0, 0, 60, 33, 1077, 0x15a71a8a, F=0x0 0, 0, 60, 33, 1077, 0x15a71a8a, F=0x0
0, 27, 27, 33, 355, 0x1ee8b91a, F=0x0 0, 27, 27, 33, 355, 0x1ee8b91a, F=0x0
0, 60, 127, 33, 1110, 0x4e1a2b12, F=0x0 0, 60, 127, 33, 1110, 0x4e1a2b12, F=0x0

View file

@ -214,4 +214,4 @@ packet|codec_type=audio|stream_index=0|pts=215040|pts_time=4.876190|dts=215040|d
packet|codec_type=audio|stream_index=0|pts=216064|pts_time=4.899410|dts=216064|dts_time=4.899410|duration=1024|duration_time=0.023220|size=203|pos=42900|flags=K__ packet|codec_type=audio|stream_index=0|pts=216064|pts_time=4.899410|dts=216064|dts_time=4.899410|duration=1024|duration_time=0.023220|size=203|pos=42900|flags=K__
packet|codec_type=audio|stream_index=0|pts=217088|pts_time=4.922630|dts=217088|dts_time=4.922630|duration=1024|duration_time=0.023220|size=198|pos=43103|flags=K__ packet|codec_type=audio|stream_index=0|pts=217088|pts_time=4.922630|dts=217088|dts_time=4.922630|duration=1024|duration_time=0.023220|size=198|pos=43103|flags=K__
packet|codec_type=audio|stream_index=0|pts=218112|pts_time=4.945850|dts=218112|dts_time=4.945850|duration=1024|duration_time=0.023220|size=284|pos=43301|flags=K__ packet|codec_type=audio|stream_index=0|pts=218112|pts_time=4.945850|dts=218112|dts_time=4.945850|duration=1024|duration_time=0.023220|size=284|pos=43301|flags=K__
packet|codec_type=audio|stream_index=0|pts=219136|pts_time=4.969070|dts=219136|dts_time=4.969070|duration=1364|duration_time=0.030930|size=5|pos=43585|flags=K__ packet|codec_type=audio|stream_index=0|pts=219136|pts_time=4.969070|dts=219136|dts_time=4.969070|duration=340|duration_time=0.007710|size=5|pos=43585|flags=K__

View file

@ -1,6 +1,6 @@
packet|codec_type=video|stream_index=0|pts=0|pts_time=0.000000|dts=-3004|dts_time=-0.033378|duration=3003|duration_time=0.033367|size=4133|pos=11309|flags=K__ packet|codec_type=video|stream_index=0|pts=0|pts_time=0.000000|dts=-3004|dts_time=-0.033378|duration=2437|duration_time=0.027078|size=4133|pos=11309|flags=K__
packet|codec_type=video|stream_index=0|pts=5440|pts_time=0.060444|dts=-567|dts_time=-0.006300|duration=3003|duration_time=0.033367|size=1077|pos=15442|flags=___ packet|codec_type=video|stream_index=0|pts=5440|pts_time=0.060444|dts=-567|dts_time=-0.006300|duration=3003|duration_time=0.033367|size=1077|pos=15442|flags=___
frame|media_type=video|stream_index=0|key_frame=1|pts=0|pts_time=0.000000|pkt_dts=-567|pkt_dts_time=-0.006300|best_effort_timestamp=0|best_effort_timestamp_time=0.000000|duration=3003|duration_time=0.033367|pkt_pos=11309|pkt_size=4133|width=160|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=yuv420p|sample_aspect_ratio=2:1|pict_type=I|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=tv|color_space=smpte170m|color_primaries=smpte170m|color_transfer=bt709|chroma_location=topleft|side_datum/3x3_displaymatrix:side_data_type=3x3 displaymatrix|side_datum/3x3_displaymatrix:displaymatrix=\n00000000: 131072 0 0\n00000001: 0 65536 0\n00000002: 0 0 1073741824\n|side_datum/3x3_displaymatrix:rotation=0|side_datum/h_26_45__user_data_unregistered_sei_message:side_data_type=H.26[45] User Data Unregistered SEI message frame|media_type=video|stream_index=0|key_frame=1|pts=0|pts_time=0.000000|pkt_dts=-567|pkt_dts_time=-0.006300|best_effort_timestamp=0|best_effort_timestamp_time=0.000000|duration=2437|duration_time=0.027078|pkt_pos=11309|pkt_size=4133|width=160|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=yuv420p|sample_aspect_ratio=2:1|pict_type=I|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=tv|color_space=smpte170m|color_primaries=smpte170m|color_transfer=bt709|chroma_location=topleft|side_datum/3x3_displaymatrix:side_data_type=3x3 displaymatrix|side_datum/3x3_displaymatrix:displaymatrix=\n00000000: 131072 0 0\n00000001: 0 65536 0\n00000002: 0 0 1073741824\n|side_datum/3x3_displaymatrix:rotation=0|side_datum/h_26_45__user_data_unregistered_sei_message:side_data_type=H.26[45] User Data Unregistered SEI message
packet|codec_type=video|stream_index=0|pts=2437|pts_time=0.027078|dts=2436|dts_time=0.027067|duration=3003|duration_time=0.033367|size=355|pos=16519|flags=___ packet|codec_type=video|stream_index=0|pts=2437|pts_time=0.027078|dts=2436|dts_time=0.027067|duration=3003|duration_time=0.033367|size=355|pos=16519|flags=___
frame|media_type=video|stream_index=0|key_frame=0|pts=2437|pts_time=0.027078|pkt_dts=2436|pkt_dts_time=0.027067|best_effort_timestamp=2437|best_effort_timestamp_time=0.027078|duration=3003|duration_time=0.033367|pkt_pos=16519|pkt_size=355|width=160|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=yuv420p|sample_aspect_ratio=2:1|pict_type=B|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=tv|color_space=smpte170m|color_primaries=smpte170m|color_transfer=bt709|chroma_location=topleft|side_datum/3x3_displaymatrix:side_data_type=3x3 displaymatrix|side_datum/3x3_displaymatrix:displaymatrix=\n00000000: 131072 0 0\n00000001: 0 65536 0\n00000002: 0 0 1073741824\n|side_datum/3x3_displaymatrix:rotation=0|side_datum/h_26_45__user_data_unregistered_sei_message:side_data_type=H.26[45] User Data Unregistered SEI message frame|media_type=video|stream_index=0|key_frame=0|pts=2437|pts_time=0.027078|pkt_dts=2436|pkt_dts_time=0.027067|best_effort_timestamp=2437|best_effort_timestamp_time=0.027078|duration=3003|duration_time=0.033367|pkt_pos=16519|pkt_size=355|width=160|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=yuv420p|sample_aspect_ratio=2:1|pict_type=B|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=tv|color_space=smpte170m|color_primaries=smpte170m|color_transfer=bt709|chroma_location=topleft|side_datum/3x3_displaymatrix:side_data_type=3x3 displaymatrix|side_datum/3x3_displaymatrix:displaymatrix=\n00000000: 131072 0 0\n00000001: 0 65536 0\n00000002: 0 0 1073741824\n|side_datum/3x3_displaymatrix:rotation=0|side_datum/h_26_45__user_data_unregistered_sei_message:side_data_type=H.26[45] User Data Unregistered SEI message
packet|codec_type=video|stream_index=0|pts=11446|pts_time=0.127178|dts=5439|dts_time=0.060433|duration=3003|duration_time=0.033367|size=1110|pos=16874|flags=___ packet|codec_type=video|stream_index=0|pts=11446|pts_time=0.127178|dts=5439|dts_time=0.060433|duration=3003|duration_time=0.033367|size=1110|pos=16874|flags=___