Mercurial > libavformat.hg
changeset 1395:c956d0ce5e91 libavformat
skip run in sequence, fix C0023S01.mxf
author | bcoudurier |
---|---|
date | Tue, 17 Oct 2006 11:23:04 +0000 |
parents | bd265fedcd65 |
children | 069c0c5a1baf |
files | mxf.c |
diffstat | 1 files changed, 25 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/mxf.c Mon Oct 16 21:47:48 2006 +0000 +++ b/mxf.c Tue Oct 17 11:23:04 2006 +0000 @@ -943,11 +943,29 @@ { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL }, }; +static int mxf_read_sync(ByteIOContext *pb, const uint8_t *key, unsigned size) +{ + int i, b; + for (i = 0; i < size && !url_feof(pb); i++) { + b = get_byte(pb); + if (b == key[0]) + i = 0; + else if (b != key[i]) + i = -1; + } + return i == size; +} + static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) { MXFContext *mxf = s->priv_data; KLVPacket klv; + if (!mxf_read_sync(&s->pb, mxf_header_partition_pack_key, 14)) { + av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n"); + return -1; + } + url_fseek(&s->pb, -14, SEEK_CUR); mxf->fc = s; while (!url_feof(&s->pb)) { const MXFMetadataReadTableEntry *function; @@ -1031,7 +1049,6 @@ { AVStream *st = s->streams[stream_index]; int64_t seconds; - int i; if (!s->bit_rate) return -1; @@ -1039,20 +1056,13 @@ sample_time = 0; seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den); url_fseek(&s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET); - /* sync on KLV essence element */ - for (i = 0; i < 12 && url_ftell(&s->pb) < s->file_size; i++) { - int b = get_byte(&s->pb); - if (b == mxf_essence_element_key[0]) - i = 0; - else if (b != mxf_essence_element_key[i]) - i = -1; - } - if (i == 12) { /* found KLV key */ - url_fseek(&s->pb, -12, SEEK_CUR); - av_update_cur_dts(s, st, sample_time); - return 0; - } - return -1; + if (!mxf_read_sync(&s->pb, mxf_essence_element_key, 12)) + return -1; + + /* found KLV key */ + url_fseek(&s->pb, -12, SEEK_CUR); + av_update_cur_dts(s, st, sample_time); + return 0; } AVInputFormat mxf_demuxer = {