mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-07-03 06:27:44 +08:00
skip run in sequence, fix C0023S01.mxf
Originally committed as revision 6720 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@ -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 },
|
{ { 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)
|
static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||||
{
|
{
|
||||||
MXFContext *mxf = s->priv_data;
|
MXFContext *mxf = s->priv_data;
|
||||||
KLVPacket klv;
|
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;
|
mxf->fc = s;
|
||||||
while (!url_feof(&s->pb)) {
|
while (!url_feof(&s->pb)) {
|
||||||
const MXFMetadataReadTableEntry *function;
|
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];
|
AVStream *st = s->streams[stream_index];
|
||||||
int64_t seconds;
|
int64_t seconds;
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!s->bit_rate)
|
if (!s->bit_rate)
|
||||||
return -1;
|
return -1;
|
||||||
@ -1039,21 +1056,14 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti
|
|||||||
sample_time = 0;
|
sample_time = 0;
|
||||||
seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
|
seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
|
||||||
url_fseek(&s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET);
|
url_fseek(&s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET);
|
||||||
/* sync on KLV essence element */
|
if (!mxf_read_sync(&s->pb, mxf_essence_element_key, 12))
|
||||||
for (i = 0; i < 12 && url_ftell(&s->pb) < s->file_size; i++) {
|
return -1;
|
||||||
int b = get_byte(&s->pb);
|
|
||||||
if (b == mxf_essence_element_key[0])
|
/* found KLV key */
|
||||||
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);
|
url_fseek(&s->pb, -12, SEEK_CUR);
|
||||||
av_update_cur_dts(s, st, sample_time);
|
av_update_cur_dts(s, st, sample_time);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
AVInputFormat mxf_demuxer = {
|
AVInputFormat mxf_demuxer = {
|
||||||
"mxf",
|
"mxf",
|
||||||
|
Reference in New Issue
Block a user