|
|
|
@@ -264,7 +264,7 @@ static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) { |
|
|
|
int map_len; |
|
|
|
int len; |
|
|
|
AVRational main_timebase = {0, 0}; |
|
|
|
struct gxf_stream_info si; |
|
|
|
struct gxf_stream_info *si = s->priv_data; |
|
|
|
int i; |
|
|
|
if (!parse_packet_header(pb, &pkt_type, &map_len) || pkt_type != PKT_MAP) { |
|
|
|
av_log(s, AV_LOG_ERROR, "map packet not found\n"); |
|
|
|
@@ -282,7 +282,7 @@ static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
map_len -= len; |
|
|
|
gxf_material_tags(pb, &len, &si); |
|
|
|
gxf_material_tags(pb, &len, si); |
|
|
|
avio_skip(pb, len); |
|
|
|
map_len -= 2; |
|
|
|
len = avio_rb16(pb); // length of track description |
|
|
|
@@ -300,7 +300,7 @@ static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) { |
|
|
|
track_id = avio_r8(pb); |
|
|
|
track_len = avio_rb16(pb); |
|
|
|
len -= track_len; |
|
|
|
gxf_track_tags(pb, &track_len, &si); |
|
|
|
gxf_track_tags(pb, &track_len, si); |
|
|
|
avio_skip(pb, track_len); |
|
|
|
if (!(track_type & 0x80)) { |
|
|
|
av_log(s, AV_LOG_ERROR, "invalid track type %x\n", track_type); |
|
|
|
@@ -316,12 +316,12 @@ static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) { |
|
|
|
if (idx < 0) continue; |
|
|
|
st = s->streams[idx]; |
|
|
|
if (!main_timebase.num || !main_timebase.den) { |
|
|
|
main_timebase.num = si.frames_per_second.den; |
|
|
|
main_timebase.den = si.frames_per_second.num * 2; |
|
|
|
main_timebase.num = si->frames_per_second.den; |
|
|
|
main_timebase.den = si->frames_per_second.num * 2; |
|
|
|
} |
|
|
|
st->start_time = si.first_field; |
|
|
|
if (si.first_field != AV_NOPTS_VALUE && si.last_field != AV_NOPTS_VALUE) |
|
|
|
st->duration = si.last_field - si.first_field; |
|
|
|
st->start_time = si->first_field; |
|
|
|
if (si->first_field != AV_NOPTS_VALUE && si->last_field != AV_NOPTS_VALUE) |
|
|
|
st->duration = si->last_field - si->first_field; |
|
|
|
} |
|
|
|
if (len < 0) |
|
|
|
av_log(s, AV_LOG_ERROR, "invalid track description length specified\n"); |
|
|
|
@@ -422,6 +422,8 @@ static int gxf_packet(AVFormatContext *s, AVPacket *pkt) { |
|
|
|
AVIOContext *pb = s->pb; |
|
|
|
GXFPktType pkt_type; |
|
|
|
int pkt_len; |
|
|
|
struct gxf_stream_info *si = s->priv_data; |
|
|
|
|
|
|
|
while (!pb->eof_reached) { |
|
|
|
AVStream *st; |
|
|
|
int track_type, track_id, ret; |
|
|
|
@@ -473,6 +475,11 @@ static int gxf_packet(AVFormatContext *s, AVPacket *pkt) { |
|
|
|
avio_skip(pb, skip); |
|
|
|
pkt->stream_index = stream_index; |
|
|
|
pkt->dts = field_nr; |
|
|
|
|
|
|
|
//set duration manually for DV or else lavf misdetects the frame rate |
|
|
|
if (st->codec->codec_id == CODEC_ID_DVVIDEO) |
|
|
|
pkt->duration = si->fields_per_frame; |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
return AVERROR(EIO); |
|
|
|
@@ -518,7 +525,7 @@ static int64_t gxf_read_timestamp(AVFormatContext *s, int stream_index, |
|
|
|
AVInputFormat ff_gxf_demuxer = { |
|
|
|
"gxf", |
|
|
|
NULL_IF_CONFIG_SMALL("GXF format"), |
|
|
|
0, |
|
|
|
sizeof(struct gxf_stream_info), |
|
|
|
gxf_probe, |
|
|
|
gxf_header, |
|
|
|
gxf_packet, |
|
|
|
|