annotate gxf.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents 63edc8683095
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
1 /*
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
2 * GXF demuxer.
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4098
diff changeset
3 * Copyright (c) 2006 Reimar Doeffinger
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1243
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1243
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1243
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1243
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1243
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
15 * Lesser General Public License for more details.
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
16 *
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1243
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2771
diff changeset
21
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2771
diff changeset
22 #include "libavutil/common.h"
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
23 #include "avformat.h"
2282
47f5906c30cc replaces hardcoded values by the equivalent enum definitions
aurel
parents: 2274
diff changeset
24 #include "gxf.h"
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
25
4074
58051a1dc7ea Use "struct gxf_stream_info" instead of "st_info_t",
reimar
parents: 3939
diff changeset
26 struct gxf_stream_info {
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
27 int64_t first_field;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
28 int64_t last_field;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
29 AVRational frames_per_second;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
30 int32_t fields_per_frame;
4074
58051a1dc7ea Use "struct gxf_stream_info" instead of "st_info_t",
reimar
parents: 3939
diff changeset
31 };
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
32
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
33 /**
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
34 * \brief parses a packet header, extracting type and length
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
35 * \param pb ByteIOContext to read header from
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
36 * \param type detected packet type is stored here
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
37 * \param length detected packet length, excluding header is stored here
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
38 * \return 0 if header not found or contains invalid data, 1 otherwise
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
39 */
4098
10d52cda08dd Avoid _t in gxf enum type names
reimar
parents: 4074
diff changeset
40 static int parse_packet_header(ByteIOContext *pb, GXFPktType *type, int *length) {
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
41 if (get_be32(pb))
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
42 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
43 if (get_byte(pb) != 1)
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
44 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
45 *type = get_byte(pb);
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
46 *length = get_be32(pb);
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
47 if ((*length >> 24) || *length < 16)
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
48 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
49 *length -= 16;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
50 if (get_be32(pb))
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
51 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
52 if (get_byte(pb) != 0xe1)
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
53 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
54 if (get_byte(pb) != 0xe2)
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
55 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
56 return 1;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
57 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
58
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
59 /**
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
60 * \brief check if file starts with a PKT_MAP header
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
61 */
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
62 static int gxf_probe(AVProbeData *p) {
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
63 static const uint8_t startcode[] = {0, 0, 0, 0, 1, 0xbc}; // start with map packet
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
64 static const uint8_t endcode[] = {0, 0, 0, 0, 0xe1, 0xe2};
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
65 if (!memcmp(p->buf, startcode, sizeof(startcode)) &&
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
66 !memcmp(&p->buf[16 - sizeof(endcode)], endcode, sizeof(endcode)))
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
67 return AVPROBE_SCORE_MAX;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
68 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
69 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
70
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
71 /**
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
72 * \brief gets the stream index for the track with the specified id, creates new
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
73 * stream if not found
6215
ccb05424c391 Fix misspelled parameter names in Doxygen documentation.
diego
parents: 6098
diff changeset
74 * \param id id of stream to find / add
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
75 * \param format stream format identifier
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
76 */
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
77 static int get_sindex(AVFormatContext *s, int id, int format) {
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
78 int i;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
79 AVStream *st = NULL;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
80 for (i = 0; i < s->nb_streams; i++) {
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
81 if (s->streams[i]->id == id)
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
82 return i;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
83 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
84 st = av_new_stream(s, id);
3400
75d4db7ae5c9 Check for av_new_stream failure, fixes CID76 RUN2
reimar
parents: 3286
diff changeset
85 if (!st)
75d4db7ae5c9 Check for av_new_stream failure, fixes CID76 RUN2
reimar
parents: 3286
diff changeset
86 return AVERROR(ENOMEM);
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
87 switch (format) {
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
88 case 3:
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
89 case 4:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
90 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
91 st->codec->codec_id = CODEC_ID_MJPEG;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
92 break;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
93 case 13:
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
94 case 15:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
95 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
96 st->codec->codec_id = CODEC_ID_DVVIDEO;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
97 break;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
98 case 14:
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
99 case 16:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
100 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
101 st->codec->codec_id = CODEC_ID_DVVIDEO;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
102 break;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
103 case 11:
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
104 case 12:
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
105 case 20:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
106 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
107 st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
2023
a3e79d6e4e3c add an enum for need_parsing
aurel
parents: 2001
diff changeset
108 st->need_parsing = AVSTREAM_PARSE_HEADERS; //get keyframe flag etc.
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
109 break;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
110 case 22:
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
111 case 23:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
112 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
113 st->codec->codec_id = CODEC_ID_MPEG1VIDEO;
2023
a3e79d6e4e3c add an enum for need_parsing
aurel
parents: 2001
diff changeset
114 st->need_parsing = AVSTREAM_PARSE_HEADERS; //get keyframe flag etc.
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
115 break;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
116 case 9:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
117 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
118 st->codec->codec_id = CODEC_ID_PCM_S24LE;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
119 st->codec->channels = 1;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
120 st->codec->sample_rate = 48000;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
121 st->codec->bit_rate = 3 * 1 * 48000 * 8;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
122 st->codec->block_align = 3 * 1;
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
123 st->codec->bits_per_coded_sample = 24;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
124 break;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
125 case 10:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
126 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
127 st->codec->codec_id = CODEC_ID_PCM_S16LE;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
128 st->codec->channels = 1;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
129 st->codec->sample_rate = 48000;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
130 st->codec->bit_rate = 2 * 1 * 48000 * 8;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
131 st->codec->block_align = 2 * 1;
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
132 st->codec->bits_per_coded_sample = 16;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
133 break;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
134 case 17:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
135 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
136 st->codec->codec_id = CODEC_ID_AC3;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
137 st->codec->channels = 2;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
138 st->codec->sample_rate = 48000;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
139 break;
1539
bc94f4215dd0 Set CODEC_TYPE_DATA for timecode tracks.
reimar
parents: 1538
diff changeset
140 // timecode tracks:
bc94f4215dd0 Set CODEC_TYPE_DATA for timecode tracks.
reimar
parents: 1538
diff changeset
141 case 7:
bc94f4215dd0 Set CODEC_TYPE_DATA for timecode tracks.
reimar
parents: 1538
diff changeset
142 case 8:
bc94f4215dd0 Set CODEC_TYPE_DATA for timecode tracks.
reimar
parents: 1538
diff changeset
143 case 24:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
144 st->codec->codec_type = AVMEDIA_TYPE_DATA;
1539
bc94f4215dd0 Set CODEC_TYPE_DATA for timecode tracks.
reimar
parents: 1538
diff changeset
145 st->codec->codec_id = CODEC_ID_NONE;
bc94f4215dd0 Set CODEC_TYPE_DATA for timecode tracks.
reimar
parents: 1538
diff changeset
146 break;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
147 default:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5759
diff changeset
148 st->codec->codec_type = AVMEDIA_TYPE_UNKNOWN;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
149 st->codec->codec_id = CODEC_ID_NONE;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
150 break;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
151 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
152 return s->nb_streams - 1;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
153 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
154
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
155 /**
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
156 * \brief filters out interesting tags from material information.
2560
bc13220fb9cd cosmetics: typo
diego
parents: 2282
diff changeset
157 * \param len length of tag section, will be adjusted to contain remaining bytes
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
158 * \param si struct to store collected information into
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
159 */
4074
58051a1dc7ea Use "struct gxf_stream_info" instead of "st_info_t",
reimar
parents: 3939
diff changeset
160 static void gxf_material_tags(ByteIOContext *pb, int *len, struct gxf_stream_info *si) {
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
161 si->first_field = AV_NOPTS_VALUE;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
162 si->last_field = AV_NOPTS_VALUE;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
163 while (*len >= 2) {
4098
10d52cda08dd Avoid _t in gxf enum type names
reimar
parents: 4074
diff changeset
164 GXFMatTag tag = get_byte(pb);
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
165 int tlen = get_byte(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
166 *len -= 2;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
167 if (tlen > *len)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
168 return;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
169 *len -= tlen;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
170 if (tlen == 4) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
171 uint32_t value = get_be32(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
172 if (tag == MAT_FIRST_FIELD)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
173 si->first_field = value;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
174 else if (tag == MAT_LAST_FIELD)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
175 si->last_field = value;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
176 } else
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
177 url_fskip(pb, tlen);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
178 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
179 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
180
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
181 /**
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
182 * \brief convert fps tag value to AVRational fps
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
183 * \param fps fps value from tag
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
184 * \return fps as AVRational, or 0 / 0 if unknown
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
185 */
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
186 static AVRational fps_tag2avr(int32_t fps) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
187 extern const AVRational ff_frame_rate_tab[];
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
188 if (fps < 1 || fps > 9) fps = 9;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
189 return ff_frame_rate_tab[9 - fps]; // values have opposite order
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
190 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
191
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
192 /**
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
193 * \brief convert UMF attributes flags to AVRational fps
6220
9b579e53bd03 Fix doxy of flags parameter in fps_umf2avr().
diego
parents: 6215
diff changeset
194 * \param flags UMF flags to convert
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
195 * \return fps as AVRational, or 0 / 0 if unknown
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
196 */
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
197 static AVRational fps_umf2avr(uint32_t flags) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
198 static const AVRational map[] = {{50, 1}, {60000, 1001}, {24, 1},
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
199 {25, 1}, {30000, 1001}};
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
200 int idx = av_log2((flags & 0x7c0) >> 6);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
201 return map[idx];
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
202 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
203
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
204 /**
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
205 * \brief filters out interesting tags from track information.
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
206 * \param len length of tag section, will be adjusted to contain remaining bytes
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
207 * \param si struct to store collected information into
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
208 */
4074
58051a1dc7ea Use "struct gxf_stream_info" instead of "st_info_t",
reimar
parents: 3939
diff changeset
209 static void gxf_track_tags(ByteIOContext *pb, int *len, struct gxf_stream_info *si) {
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
210 si->frames_per_second = (AVRational){0, 0};
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
211 si->fields_per_frame = 0;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
212 while (*len >= 2) {
4098
10d52cda08dd Avoid _t in gxf enum type names
reimar
parents: 4074
diff changeset
213 GXFTrackTag tag = get_byte(pb);
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
214 int tlen = get_byte(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
215 *len -= 2;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
216 if (tlen > *len)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
217 return;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
218 *len -= tlen;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
219 if (tlen == 4) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
220 uint32_t value = get_be32(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
221 if (tag == TRACK_FPS)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
222 si->frames_per_second = fps_tag2avr(value);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
223 else if (tag == TRACK_FPF && (value == 1 || value == 2))
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
224 si->fields_per_frame = value;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
225 } else
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
226 url_fskip(pb, tlen);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
227 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
228 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
229
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
230 /**
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
231 * \brief read index from FLT packet into stream 0 av_index
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
232 */
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
233 static void gxf_read_index(AVFormatContext *s, int pkt_len) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2560
diff changeset
234 ByteIOContext *pb = s->pb;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
235 AVStream *st = s->streams[0];
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
236 uint32_t fields_per_map = get_le32(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
237 uint32_t map_cnt = get_le32(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
238 int i;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
239 pkt_len -= 8;
6098
47759a2966f6 Support AVFMT_FLAG_IGNIDX in gxf demuxer.
reimar
parents: 5910
diff changeset
240 if (s->flags & AVFMT_FLAG_IGNIDX) {
47759a2966f6 Support AVFMT_FLAG_IGNIDX in gxf demuxer.
reimar
parents: 5910
diff changeset
241 url_fskip(pb, pkt_len);
47759a2966f6 Support AVFMT_FLAG_IGNIDX in gxf demuxer.
reimar
parents: 5910
diff changeset
242 return;
47759a2966f6 Support AVFMT_FLAG_IGNIDX in gxf demuxer.
reimar
parents: 5910
diff changeset
243 }
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
244 if (map_cnt > 1000) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
245 av_log(s, AV_LOG_ERROR, "too many index entries %u (%x)\n", map_cnt, map_cnt);
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
246 map_cnt = 1000;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
247 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
248 if (pkt_len < 4 * map_cnt) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
249 av_log(s, AV_LOG_ERROR, "invalid index length\n");
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
250 url_fskip(pb, pkt_len);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
251 return;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
252 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
253 pkt_len -= 4 * map_cnt;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
254 av_add_index_entry(st, 0, 0, 0, 0, 0);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
255 for (i = 0; i < map_cnt; i++)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
256 av_add_index_entry(st, (uint64_t)get_le32(pb) * 1024,
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
257 i * (uint64_t)fields_per_map + 1, 0, 0, 0);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
258 url_fskip(pb, pkt_len);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
259 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
260
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
261 static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2560
diff changeset
262 ByteIOContext *pb = s->pb;
4098
10d52cda08dd Avoid _t in gxf enum type names
reimar
parents: 4074
diff changeset
263 GXFPktType pkt_type;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
264 int map_len;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
265 int len;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
266 AVRational main_timebase = {0, 0};
4074
58051a1dc7ea Use "struct gxf_stream_info" instead of "st_info_t",
reimar
parents: 3939
diff changeset
267 struct gxf_stream_info si;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
268 int i;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
269 if (!parse_packet_header(pb, &pkt_type, &map_len) || pkt_type != PKT_MAP) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
270 av_log(s, AV_LOG_ERROR, "map packet not found\n");
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
271 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
272 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
273 map_len -= 2;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
274 if (get_byte(pb) != 0x0e0 || get_byte(pb) != 0xff) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
275 av_log(s, AV_LOG_ERROR, "unknown version or invalid map preamble\n");
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
276 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
277 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
278 map_len -= 2;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
279 len = get_be16(pb); // length of material data section
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
280 if (len > map_len) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
281 av_log(s, AV_LOG_ERROR, "material data longer than map data\n");
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
282 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
283 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
284 map_len -= len;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
285 gxf_material_tags(pb, &len, &si);
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
286 url_fskip(pb, len);
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
287 map_len -= 2;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
288 len = get_be16(pb); // length of track description
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
289 if (len > map_len) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
290 av_log(s, AV_LOG_ERROR, "track description longer than map data\n");
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
291 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
292 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
293 map_len -= len;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
294 while (len > 0) {
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
295 int track_type, track_id, track_len;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
296 AVStream *st;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
297 int idx;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
298 len -= 4;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
299 track_type = get_byte(pb);
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
300 track_id = get_byte(pb);
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
301 track_len = get_be16(pb);
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
302 len -= track_len;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
303 gxf_track_tags(pb, &track_len, &si);
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
304 url_fskip(pb, track_len);
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
305 if (!(track_type & 0x80)) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
306 av_log(s, AV_LOG_ERROR, "invalid track type %x\n", track_type);
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
307 continue;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
308 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
309 track_type &= 0x7f;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
310 if ((track_id & 0xc0) != 0xc0) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
311 av_log(s, AV_LOG_ERROR, "invalid track id %x\n", track_id);
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
312 continue;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
313 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
314 track_id &= 0x3f;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
315 idx = get_sindex(s, track_id, track_type);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
316 if (idx < 0) continue;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
317 st = s->streams[idx];
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
318 if (!main_timebase.num || !main_timebase.den) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
319 main_timebase.num = si.frames_per_second.den;
5758
fcf809c679f2 GXF time base is always based on "fields" per second even for
reimar
parents: 4251
diff changeset
320 main_timebase.den = si.frames_per_second.num * 2;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
321 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
322 st->start_time = si.first_field;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
323 if (si.first_field != AV_NOPTS_VALUE && si.last_field != AV_NOPTS_VALUE)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
324 st->duration = si.last_field - si.first_field;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
325 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
326 if (len < 0)
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
327 av_log(s, AV_LOG_ERROR, "invalid track description length specified\n");
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
328 if (map_len)
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
329 url_fskip(pb, map_len);
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
330 if (!parse_packet_header(pb, &pkt_type, &len)) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
331 av_log(s, AV_LOG_ERROR, "sync lost in header\n");
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
332 return -1;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
333 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
334 if (pkt_type == PKT_FLT) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
335 gxf_read_index(s, len);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
336 if (!parse_packet_header(pb, &pkt_type, &len)) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
337 av_log(s, AV_LOG_ERROR, "sync lost in header\n");
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
338 return -1;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
339 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
340 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
341 if (pkt_type == PKT_UMF) {
1763
e77907af9057 10l, forgot to skip payload description in UMF packet parsing
reimar
parents: 1539
diff changeset
342 if (len >= 0x39) {
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
343 AVRational fps;
1763
e77907af9057 10l, forgot to skip payload description in UMF packet parsing
reimar
parents: 1539
diff changeset
344 len -= 0x39;
e77907af9057 10l, forgot to skip payload description in UMF packet parsing
reimar
parents: 1539
diff changeset
345 url_fskip(pb, 5); // preamble
e77907af9057 10l, forgot to skip payload description in UMF packet parsing
reimar
parents: 1539
diff changeset
346 url_fskip(pb, 0x30); // payload description
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
347 fps = fps_umf2avr(get_le32(pb));
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
348 if (!main_timebase.num || !main_timebase.den) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
349 // this may not always be correct, but simply the best we can get
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
350 main_timebase.num = fps.den;
5758
fcf809c679f2 GXF time base is always based on "fields" per second even for
reimar
parents: 4251
diff changeset
351 main_timebase.den = fps.num * 2;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
352 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
353 } else
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
354 av_log(s, AV_LOG_INFO, "UMF packet too short\n");
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
355 } else
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
356 av_log(s, AV_LOG_INFO, "UMF packet missing\n");
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
357 url_fskip(pb, len);
5759
9c83f9226020 Set GXF fallback time-base to match the one specified for audio-only.
reimar
parents: 5758
diff changeset
358 // set a fallback value, 60000/1001 is specified for audio-only files
9c83f9226020 Set GXF fallback time-base to match the one specified for audio-only.
reimar
parents: 5758
diff changeset
359 // so use that regardless of why we do not know the video frame rate.
1767
f1186797fbf5 Use av_set_pts_info and set some arbitrary timebase fallback
reimar
parents: 1765
diff changeset
360 if (!main_timebase.num || !main_timebase.den)
5759
9c83f9226020 Set GXF fallback time-base to match the one specified for audio-only.
reimar
parents: 5758
diff changeset
361 main_timebase = (AVRational){1001, 60000};
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
362 for (i = 0; i < s->nb_streams; i++) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
363 AVStream *st = s->streams[i];
1767
f1186797fbf5 Use av_set_pts_info and set some arbitrary timebase fallback
reimar
parents: 1765
diff changeset
364 av_set_pts_info(st, 32, main_timebase.num, main_timebase.den);
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
365 }
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
366 return 0;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
367 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
368
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
369 #define READ_ONE() \
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
370 { \
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
371 if (!max_interval-- || url_feof(pb)) \
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
372 goto out; \
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
373 tmp = tmp << 8 | get_byte(pb); \
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
374 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
375
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
376 /**
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
377 * \brief resync the stream on the next media packet with specified properties
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
378 * \param max_interval how many bytes to search for matching packet at most
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
379 * \param track track id the media packet must belong to, -1 for any
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
380 * \param timestamp minimum timestamp (== field number) the packet must have, -1 for any
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
381 * \return timestamp of packet found
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
382 */
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
383 static int64_t gxf_resync_media(AVFormatContext *s, uint64_t max_interval, int track, int timestamp) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
384 uint32_t tmp;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
385 uint64_t last_pos;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
386 uint64_t last_found_pos = 0;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
387 int cur_track;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
388 int64_t cur_timestamp = AV_NOPTS_VALUE;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
389 int len;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2560
diff changeset
390 ByteIOContext *pb = s->pb;
4098
10d52cda08dd Avoid _t in gxf enum type names
reimar
parents: 4074
diff changeset
391 GXFPktType type;
1221
ad456312dd5e Minor resync optimization
reimar
parents: 1219
diff changeset
392 tmp = get_be32(pb);
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
393 start:
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
394 while (tmp)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
395 READ_ONE();
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
396 READ_ONE();
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
397 if (tmp != 1)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
398 goto start;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
399 last_pos = url_ftell(pb);
6249
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
400 if (url_fseek(pb, -5, SEEK_CUR) < 0)
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
401 goto out;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
402 if (!parse_packet_header(pb, &type, &len) || type != PKT_MEDIA) {
6249
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
403 if (url_fseek(pb, last_pos, SEEK_SET) < 0)
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
404 goto out;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
405 goto start;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
406 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
407 get_byte(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
408 cur_track = get_byte(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
409 cur_timestamp = get_be32(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
410 last_found_pos = url_ftell(pb) - 16 - 6;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
411 if ((track >= 0 && track != cur_track) || (timestamp >= 0 && timestamp > cur_timestamp)) {
6249
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
412 if (url_fseek(pb, last_pos, SEEK_SET) >= 0)
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
413 goto start;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
414 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
415 out:
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
416 if (last_found_pos)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
417 url_fseek(pb, last_found_pos, SEEK_SET);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
418 return cur_timestamp;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
419 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
420
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
421 static int gxf_packet(AVFormatContext *s, AVPacket *pkt) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2560
diff changeset
422 ByteIOContext *pb = s->pb;
4098
10d52cda08dd Avoid _t in gxf enum type names
reimar
parents: 4074
diff changeset
423 GXFPktType pkt_type;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
424 int pkt_len;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
425 while (!url_feof(pb)) {
3938
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
426 AVStream *st;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
427 int track_type, track_id, ret;
3938
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
428 int field_nr, field_info, skip = 0;
3400
75d4db7ae5c9 Check for av_new_stream failure, fixes CID76 RUN2
reimar
parents: 3286
diff changeset
429 int stream_index;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
430 if (!parse_packet_header(pb, &pkt_type, &pkt_len)) {
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
431 if (!url_feof(pb))
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
432 av_log(s, AV_LOG_ERROR, "sync lost\n");
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
433 return -1;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
434 }
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
435 if (pkt_type == PKT_FLT) {
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
436 gxf_read_index(s, pkt_len);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
437 continue;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
438 }
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
439 if (pkt_type != PKT_MEDIA) {
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
440 url_fskip(pb, pkt_len);
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
441 continue;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
442 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
443 if (pkt_len < 16) {
3939
20da3b0e6adf cosmetics, remove GXF: in log messages since it is present in context
bcoudurier
parents: 3938
diff changeset
444 av_log(s, AV_LOG_ERROR, "invalid media packet length\n");
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
445 continue;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
446 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
447 pkt_len -= 16;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
448 track_type = get_byte(pb);
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
449 track_id = get_byte(pb);
3400
75d4db7ae5c9 Check for av_new_stream failure, fixes CID76 RUN2
reimar
parents: 3286
diff changeset
450 stream_index = get_sindex(s, track_id, track_type);
75d4db7ae5c9 Check for av_new_stream failure, fixes CID76 RUN2
reimar
parents: 3286
diff changeset
451 if (stream_index < 0)
75d4db7ae5c9 Check for av_new_stream failure, fixes CID76 RUN2
reimar
parents: 3286
diff changeset
452 return stream_index;
3938
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
453 st = s->streams[stream_index];
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
454 field_nr = get_be32(pb);
3938
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
455 field_info = get_be32(pb);
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
456 get_be32(pb); // "timeline" field number
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
457 get_byte(pb); // flags
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
458 get_byte(pb); // reserved
3938
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
459 if (st->codec->codec_id == CODEC_ID_PCM_S24LE ||
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
460 st->codec->codec_id == CODEC_ID_PCM_S16LE) {
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
461 int first = field_info >> 16;
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
462 int last = field_info & 0xffff; // last is exclusive
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
463 int bps = av_get_bits_per_sample(st->codec->codec_id)>>3;
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
464 if (first <= last && last*bps <= pkt_len) {
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
465 url_fskip(pb, first*bps);
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
466 skip = pkt_len - last*bps;
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
467 pkt_len = (last-first)*bps;
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
468 } else
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
469 av_log(s, AV_LOG_ERROR, "invalid first and last sample values\n");
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
470 }
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
471 ret = av_get_packet(pb, pkt, pkt_len);
3938
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
472 if (skip)
aaae317c3d54 skip invalid audio samples in gxf packets
bcoudurier
parents: 3908
diff changeset
473 url_fskip(pb, skip);
3400
75d4db7ae5c9 Check for av_new_stream failure, fixes CID76 RUN2
reimar
parents: 3286
diff changeset
474 pkt->stream_index = stream_index;
1243
088e77e1d06f both timestamps are dts, (checked trailer.gxf, spec is unclear)
michael
parents: 1222
diff changeset
475 pkt->dts = field_nr;
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
476 return ret;
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
477 }
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2023
diff changeset
478 return AVERROR(EIO);
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
479 }
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
480
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
481 static int gxf_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) {
6249
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
482 int res = 0;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
483 uint64_t pos;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
484 uint64_t maxlen = 100 * 1024 * 1024;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
485 AVStream *st = s->streams[0];
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
486 int64_t start_time = s->streams[stream_index]->start_time;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
487 int64_t found;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
488 int idx;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
489 if (timestamp < start_time) timestamp = start_time;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
490 idx = av_index_search_timestamp(st, timestamp - start_time,
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
491 AVSEEK_FLAG_ANY | AVSEEK_FLAG_BACKWARD);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
492 if (idx < 0)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
493 return -1;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
494 pos = st->index_entries[idx].pos;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
495 if (idx < st->nb_index_entries - 2)
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
496 maxlen = st->index_entries[idx + 2].pos - pos;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
497 maxlen = FFMAX(maxlen, 200 * 1024);
6249
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
498 res = url_fseek(s->pb, pos, SEEK_SET);
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
499 if (res < 0)
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
500 return res;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
501 found = gxf_resync_media(s, maxlen, -1, timestamp);
1379
4146500158b5 Rename ABS macro to FFABS.
diego
parents: 1358
diff changeset
502 if (FFABS(found - timestamp) > 4)
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
503 return -1;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
504 return 0;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
505 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
506
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
507 static int64_t gxf_read_timestamp(AVFormatContext *s, int stream_index,
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
508 int64_t *pos, int64_t pos_limit) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2560
diff changeset
509 ByteIOContext *pb = s->pb;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
510 int64_t res;
6249
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
511 if (url_fseek(pb, *pos, SEEK_SET) < 0)
63edc8683095 Check url_fseek results in gxf demuxer.
reimar
parents: 6220
diff changeset
512 return AV_NOPTS_VALUE;
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
513 res = gxf_resync_media(s, pos_limit - *pos, -1, -1);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
514 *pos = url_ftell(pb);
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
515 return res;
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
516 }
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
517
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
518 AVInputFormat gxf_demuxer = {
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
519 "gxf",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3400
diff changeset
520 NULL_IF_CONFIG_SMALL("GXF format"),
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
521 0,
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
522 gxf_probe,
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
523 gxf_header,
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
524 gxf_packet,
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
525 NULL,
1214
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
526 gxf_seek,
4dbf4b5e675d Support for seeking, both with and without index and correct timestamps
reimar
parents: 1207
diff changeset
527 gxf_read_timestamp,
1145
95054d76b7e6 add GXF demuxer
reimar
parents:
diff changeset
528 };