summaryrefslogtreecommitdiff
path: root/libavformat/mxf.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2006-10-17 11:23:04 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2006-10-17 11:23:04 +0000
commitee71ef5cf42cfb07724b479deee6fd3eb5df1b76 (patch)
tree22bef4039f661b2e3039f8a16ab93b1b662266b5 /libavformat/mxf.c
parentcc6a90dd49e774f03cb28a5d389335c8ac453eff (diff)
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.c40
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 = {