diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2006-10-17 11:23:04 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2006-10-17 11:23:04 +0000 |
commit | ee71ef5cf42cfb07724b479deee6fd3eb5df1b76 (patch) | |
tree | 22bef4039f661b2e3039f8a16ab93b1b662266b5 /libavformat/mxf.c | |
parent | cc6a90dd49e774f03cb28a5d389335c8ac453eff (diff) | |
download | ffmpeg-ee71ef5cf42cfb07724b479deee6fd3eb5df1b76.tar.gz |
skip run in sequence, fix C0023S01.mxf
Originally committed as revision 6720 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/mxf.c')
-rw-r--r-- | libavformat/mxf.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/libavformat/mxf.c b/libavformat/mxf.c index ca30c5e45e..c0aa5086b2 100644 --- a/libavformat/mxf.c +++ b/libavformat/mxf.c @@ -943,11 +943,29 @@ static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = { { { 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 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti { AVStream *st = s->streams[stream_index]; int64_t seconds; - int i; if (!s->bit_rate) return -1; @@ -1039,20 +1056,13 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti 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 = { |