]> git.sesse.net Git - ffmpeg/blob - libavformat/gxf.c
latm: Always reconfigure if no extradata was set previously
[ffmpeg] / libavformat / gxf.c
1 /*
2  * GXF demuxer.
3  * Copyright (c) 2006 Reimar Doeffinger
4  *
5  * This file is part of Libav.
6  *
7  * Libav is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * Libav is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #include "libavutil/channel_layout.h"
23 #include "libavutil/common.h"
24 #include "avformat.h"
25 #include "internal.h"
26 #include "gxf.h"
27 #include "libavcodec/mpeg12data.h"
28
29 struct gxf_stream_info {
30     int64_t first_field;
31     int64_t last_field;
32     AVRational frames_per_second;
33     int32_t fields_per_frame;
34 };
35
36 /**
37  * @brief parses a packet header, extracting type and length
38  * @param pb AVIOContext to read header from
39  * @param type detected packet type is stored here
40  * @param length detected packet length, excluding header is stored here
41  * @return 0 if header not found or contains invalid data, 1 otherwise
42  */
43 static int parse_packet_header(AVIOContext *pb, GXFPktType *type, int *length) {
44     if (avio_rb32(pb))
45         return 0;
46     if (avio_r8(pb) != 1)
47         return 0;
48     *type = avio_r8(pb);
49     *length = avio_rb32(pb);
50     if ((*length >> 24) || *length < 16)
51         return 0;
52     *length -= 16;
53     if (avio_rb32(pb))
54         return 0;
55     if (avio_r8(pb) != 0xe1)
56         return 0;
57     if (avio_r8(pb) != 0xe2)
58         return 0;
59     return 1;
60 }
61
62 /**
63  * @brief check if file starts with a PKT_MAP header
64  */
65 static int gxf_probe(AVProbeData *p) {
66     static const uint8_t startcode[] = {0, 0, 0, 0, 1, 0xbc}; // start with map packet
67     static const uint8_t endcode[] = {0, 0, 0, 0, 0xe1, 0xe2};
68     if (!memcmp(p->buf, startcode, sizeof(startcode)) &&
69         !memcmp(&p->buf[16 - sizeof(endcode)], endcode, sizeof(endcode)))
70         return AVPROBE_SCORE_MAX;
71     return 0;
72 }
73
74 /**
75  * @brief gets the stream index for the track with the specified id, creates new
76  *        stream if not found
77  * @param id     id of stream to find / add
78  * @param format stream format identifier
79  */
80 static int get_sindex(AVFormatContext *s, int id, int format) {
81     int i;
82     AVStream *st = NULL;
83     i = ff_find_stream_index(s, id);
84     if (i >= 0)
85         return i;
86     st = avformat_new_stream(s, NULL);
87     if (!st)
88         return AVERROR(ENOMEM);
89     st->id = id;
90     switch (format) {
91         case 3:
92         case 4:
93             st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
94             st->codec->codec_id = AV_CODEC_ID_MJPEG;
95             break;
96         case 13:
97         case 15:
98             st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
99             st->codec->codec_id = AV_CODEC_ID_DVVIDEO;
100             break;
101         case 14:
102         case 16:
103             st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
104             st->codec->codec_id = AV_CODEC_ID_DVVIDEO;
105             break;
106         case 11:
107         case 12:
108         case 20:
109             st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
110             st->codec->codec_id = AV_CODEC_ID_MPEG2VIDEO;
111             st->need_parsing = AVSTREAM_PARSE_HEADERS; //get keyframe flag etc.
112             break;
113         case 22:
114         case 23:
115             st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
116             st->codec->codec_id = AV_CODEC_ID_MPEG1VIDEO;
117             st->need_parsing = AVSTREAM_PARSE_HEADERS; //get keyframe flag etc.
118             break;
119         case 9:
120             st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
121             st->codec->codec_id = AV_CODEC_ID_PCM_S24LE;
122             st->codec->channels = 1;
123             st->codec->channel_layout = AV_CH_LAYOUT_MONO;
124             st->codec->sample_rate = 48000;
125             st->codec->bit_rate = 3 * 1 * 48000 * 8;
126             st->codec->block_align = 3 * 1;
127             st->codec->bits_per_coded_sample = 24;
128             break;
129         case 10:
130             st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
131             st->codec->codec_id = AV_CODEC_ID_PCM_S16LE;
132             st->codec->channels = 1;
133             st->codec->channel_layout = AV_CH_LAYOUT_MONO;
134             st->codec->sample_rate = 48000;
135             st->codec->bit_rate = 2 * 1 * 48000 * 8;
136             st->codec->block_align = 2 * 1;
137             st->codec->bits_per_coded_sample = 16;
138             break;
139         case 17:
140             st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
141             st->codec->codec_id = AV_CODEC_ID_AC3;
142             st->codec->channels = 2;
143             st->codec->channel_layout = AV_CH_LAYOUT_STEREO;
144             st->codec->sample_rate = 48000;
145             break;
146         // timecode tracks:
147         case 7:
148         case 8:
149         case 24:
150             st->codec->codec_type = AVMEDIA_TYPE_DATA;
151             st->codec->codec_id = AV_CODEC_ID_NONE;
152             break;
153         default:
154             st->codec->codec_type = AVMEDIA_TYPE_UNKNOWN;
155             st->codec->codec_id = AV_CODEC_ID_NONE;
156             break;
157     }
158     return s->nb_streams - 1;
159 }
160
161 /**
162  * @brief filters out interesting tags from material information.
163  * @param len length of tag section, will be adjusted to contain remaining bytes
164  * @param si struct to store collected information into
165  */
166 static void gxf_material_tags(AVIOContext *pb, int *len, struct gxf_stream_info *si) {
167     si->first_field = AV_NOPTS_VALUE;
168     si->last_field = AV_NOPTS_VALUE;
169     while (*len >= 2) {
170         GXFMatTag tag = avio_r8(pb);
171         int tlen = avio_r8(pb);
172         *len -= 2;
173         if (tlen > *len)
174             return;
175         *len -= tlen;
176         if (tlen == 4) {
177             uint32_t value = avio_rb32(pb);
178             if (tag == MAT_FIRST_FIELD)
179                 si->first_field = value;
180             else if (tag == MAT_LAST_FIELD)
181                 si->last_field = value;
182         } else
183             avio_skip(pb, tlen);
184     }
185 }
186
187 static const AVRational frame_rate_tab[] = {
188     {   60,    1},
189     {60000, 1001},
190     {   50,    1},
191     {   30,    1},
192     {30000, 1001},
193     {   25,    1},
194     {   24,    1},
195     {24000, 1001},
196     {    0,    0},
197 };
198
199 /**
200  * @brief convert fps tag value to AVRational fps
201  * @param fps fps value from tag
202  * @return fps as AVRational, or 0 / 0 if unknown
203  */
204 static AVRational fps_tag2avr(int32_t fps) {
205     if (fps < 1 || fps > 9) fps = 9;
206     return frame_rate_tab[fps - 1];
207 }
208
209 /**
210  * @brief convert UMF attributes flags to AVRational fps
211  * @param flags UMF flags to convert
212  * @return fps as AVRational, or 0 / 0 if unknown
213  */
214 static AVRational fps_umf2avr(uint32_t flags) {
215     static const AVRational map[] = {{50, 1}, {60000, 1001}, {24, 1},
216         {25, 1}, {30000, 1001}};
217     int idx =  av_log2((flags & 0x7c0) >> 6);
218     return map[idx];
219 }
220
221 /**
222  * @brief filters out interesting tags from track information.
223  * @param len length of tag section, will be adjusted to contain remaining bytes
224  * @param si struct to store collected information into
225  */
226 static void gxf_track_tags(AVIOContext *pb, int *len, struct gxf_stream_info *si) {
227     si->frames_per_second = (AVRational){0, 0};
228     si->fields_per_frame = 0;
229     while (*len >= 2) {
230         GXFTrackTag tag = avio_r8(pb);
231         int tlen = avio_r8(pb);
232         *len -= 2;
233         if (tlen > *len)
234             return;
235         *len -= tlen;
236         if (tlen == 4) {
237             uint32_t value = avio_rb32(pb);
238             if (tag == TRACK_FPS)
239                 si->frames_per_second = fps_tag2avr(value);
240             else if (tag == TRACK_FPF && (value == 1 || value == 2))
241                 si->fields_per_frame = value;
242         } else
243             avio_skip(pb, tlen);
244     }
245 }
246
247 /**
248  * @brief read index from FLT packet into stream 0 av_index
249  */
250 static void gxf_read_index(AVFormatContext *s, int pkt_len) {
251     AVIOContext *pb = s->pb;
252     AVStream *st = s->streams[0];
253     uint32_t fields_per_map = avio_rl32(pb);
254     uint32_t map_cnt = avio_rl32(pb);
255     int i;
256     pkt_len -= 8;
257     if (s->flags & AVFMT_FLAG_IGNIDX) {
258         avio_skip(pb, pkt_len);
259         return;
260     }
261     if (map_cnt > 1000) {
262         av_log(s, AV_LOG_ERROR, "too many index entries %u (%x)\n", map_cnt, map_cnt);
263         map_cnt = 1000;
264     }
265     if (pkt_len < 4 * map_cnt) {
266         av_log(s, AV_LOG_ERROR, "invalid index length\n");
267         avio_skip(pb, pkt_len);
268         return;
269     }
270     pkt_len -= 4 * map_cnt;
271     av_add_index_entry(st, 0, 0, 0, 0, 0);
272     for (i = 0; i < map_cnt; i++)
273         av_add_index_entry(st, (uint64_t)avio_rl32(pb) * 1024,
274                            i * (uint64_t)fields_per_map + 1, 0, 0, 0);
275     avio_skip(pb, pkt_len);
276 }
277
278 static int gxf_header(AVFormatContext *s) {
279     AVIOContext *pb = s->pb;
280     GXFPktType pkt_type;
281     int map_len;
282     int len;
283     AVRational main_timebase = {0, 0};
284     struct gxf_stream_info *si = s->priv_data;
285     int i;
286     if (!parse_packet_header(pb, &pkt_type, &map_len) || pkt_type != PKT_MAP) {
287         av_log(s, AV_LOG_ERROR, "map packet not found\n");
288         return 0;
289     }
290     map_len -= 2;
291     if (avio_r8(pb) != 0x0e0 || avio_r8(pb) != 0xff) {
292         av_log(s, AV_LOG_ERROR, "unknown version or invalid map preamble\n");
293         return 0;
294     }
295     map_len -= 2;
296     len = avio_rb16(pb); // length of material data section
297     if (len > map_len) {
298         av_log(s, AV_LOG_ERROR, "material data longer than map data\n");
299         return 0;
300     }
301     map_len -= len;
302     gxf_material_tags(pb, &len, si);
303     avio_skip(pb, len);
304     map_len -= 2;
305     len = avio_rb16(pb); // length of track description
306     if (len > map_len) {
307         av_log(s, AV_LOG_ERROR, "track description longer than map data\n");
308         return 0;
309     }
310     map_len -= len;
311     while (len > 0) {
312         int track_type, track_id, track_len;
313         AVStream *st;
314         int idx;
315         len -= 4;
316         track_type = avio_r8(pb);
317         track_id = avio_r8(pb);
318         track_len = avio_rb16(pb);
319         len -= track_len;
320         gxf_track_tags(pb, &track_len, si);
321         avio_skip(pb, track_len);
322         if (!(track_type & 0x80)) {
323            av_log(s, AV_LOG_ERROR, "invalid track type %x\n", track_type);
324            continue;
325         }
326         track_type &= 0x7f;
327         if ((track_id & 0xc0) != 0xc0) {
328            av_log(s, AV_LOG_ERROR, "invalid track id %x\n", track_id);
329            continue;
330         }
331         track_id &= 0x3f;
332         idx = get_sindex(s, track_id, track_type);
333         if (idx < 0) continue;
334         st = s->streams[idx];
335         if (!main_timebase.num || !main_timebase.den) {
336             main_timebase.num = si->frames_per_second.den;
337             main_timebase.den = si->frames_per_second.num * 2;
338         }
339         st->start_time = si->first_field;
340         if (si->first_field != AV_NOPTS_VALUE && si->last_field != AV_NOPTS_VALUE)
341             st->duration = si->last_field - si->first_field;
342     }
343     if (len < 0)
344         av_log(s, AV_LOG_ERROR, "invalid track description length specified\n");
345     if (map_len)
346         avio_skip(pb, map_len);
347     if (!parse_packet_header(pb, &pkt_type, &len)) {
348         av_log(s, AV_LOG_ERROR, "sync lost in header\n");
349         return -1;
350     }
351     if (pkt_type == PKT_FLT) {
352         gxf_read_index(s, len);
353         if (!parse_packet_header(pb, &pkt_type, &len)) {
354             av_log(s, AV_LOG_ERROR, "sync lost in header\n");
355             return -1;
356         }
357     }
358     if (pkt_type == PKT_UMF) {
359         if (len >= 0x39) {
360             AVRational fps;
361             len -= 0x39;
362             avio_skip(pb, 5); // preamble
363             avio_skip(pb, 0x30); // payload description
364             fps = fps_umf2avr(avio_rl32(pb));
365             if (!main_timebase.num || !main_timebase.den) {
366                 // this may not always be correct, but simply the best we can get
367                 main_timebase.num = fps.den;
368                 main_timebase.den = fps.num * 2;
369             }
370         } else
371             av_log(s, AV_LOG_INFO, "UMF packet too short\n");
372     } else
373         av_log(s, AV_LOG_INFO, "UMF packet missing\n");
374     avio_skip(pb, len);
375     // set a fallback value, 60000/1001 is specified for audio-only files
376     // so use that regardless of why we do not know the video frame rate.
377     if (!main_timebase.num || !main_timebase.den)
378         main_timebase = (AVRational){1001, 60000};
379     for (i = 0; i < s->nb_streams; i++) {
380         AVStream *st = s->streams[i];
381         avpriv_set_pts_info(st, 32, main_timebase.num, main_timebase.den);
382     }
383     return 0;
384 }
385
386 #define READ_ONE() \
387     { \
388         if (!max_interval-- || pb->eof_reached) \
389             goto out; \
390         tmp = tmp << 8 | avio_r8(pb); \
391     }
392
393 /**
394  * @brief resync the stream on the next media packet with specified properties
395  * @param max_interval how many bytes to search for matching packet at most
396  * @param track track id the media packet must belong to, -1 for any
397  * @param timestamp minimum timestamp (== field number) the packet must have, -1 for any
398  * @return timestamp of packet found
399  */
400 static int64_t gxf_resync_media(AVFormatContext *s, uint64_t max_interval, int track, int timestamp) {
401     uint32_t tmp;
402     uint64_t last_pos;
403     uint64_t last_found_pos = 0;
404     int cur_track;
405     int64_t cur_timestamp = AV_NOPTS_VALUE;
406     int len;
407     AVIOContext *pb = s->pb;
408     GXFPktType type;
409     tmp = avio_rb32(pb);
410 start:
411     while (tmp)
412         READ_ONE();
413     READ_ONE();
414     if (tmp != 1)
415         goto start;
416     last_pos = avio_tell(pb);
417     if (avio_seek(pb, -5, SEEK_CUR) < 0)
418         goto out;
419     if (!parse_packet_header(pb, &type, &len) || type != PKT_MEDIA) {
420         if (avio_seek(pb, last_pos, SEEK_SET) < 0)
421             goto out;
422         goto start;
423     }
424     avio_r8(pb);
425     cur_track = avio_r8(pb);
426     cur_timestamp = avio_rb32(pb);
427     last_found_pos = avio_tell(pb) - 16 - 6;
428     if ((track >= 0 && track != cur_track) || (timestamp >= 0 && timestamp > cur_timestamp)) {
429         if (avio_seek(pb, last_pos, SEEK_SET) >= 0)
430             goto start;
431     }
432 out:
433     if (last_found_pos)
434         avio_seek(pb, last_found_pos, SEEK_SET);
435     return cur_timestamp;
436 }
437
438 static int gxf_packet(AVFormatContext *s, AVPacket *pkt) {
439     AVIOContext *pb = s->pb;
440     GXFPktType pkt_type;
441     int pkt_len;
442     struct gxf_stream_info *si = s->priv_data;
443
444     while (!pb->eof_reached) {
445         AVStream *st;
446         int track_type, track_id, ret;
447         int field_nr, field_info, skip = 0;
448         int stream_index;
449         if (!parse_packet_header(pb, &pkt_type, &pkt_len)) {
450             if (!pb->eof_reached)
451                 av_log(s, AV_LOG_ERROR, "sync lost\n");
452             return -1;
453         }
454         if (pkt_type == PKT_FLT) {
455             gxf_read_index(s, pkt_len);
456             continue;
457         }
458         if (pkt_type != PKT_MEDIA) {
459             avio_skip(pb, pkt_len);
460             continue;
461         }
462         if (pkt_len < 16) {
463             av_log(s, AV_LOG_ERROR, "invalid media packet length\n");
464             continue;
465         }
466         pkt_len -= 16;
467         track_type = avio_r8(pb);
468         track_id = avio_r8(pb);
469         stream_index = get_sindex(s, track_id, track_type);
470         if (stream_index < 0)
471             return stream_index;
472         st = s->streams[stream_index];
473         field_nr = avio_rb32(pb);
474         field_info = avio_rb32(pb);
475         avio_rb32(pb); // "timeline" field number
476         avio_r8(pb); // flags
477         avio_r8(pb); // reserved
478         if (st->codec->codec_id == AV_CODEC_ID_PCM_S24LE ||
479             st->codec->codec_id == AV_CODEC_ID_PCM_S16LE) {
480             int first = field_info >> 16;
481             int last  = field_info & 0xffff; // last is exclusive
482             int bps = av_get_bits_per_sample(st->codec->codec_id)>>3;
483             if (first <= last && last*bps <= pkt_len) {
484                 avio_skip(pb, first*bps);
485                 skip = pkt_len - last*bps;
486                 pkt_len = (last-first)*bps;
487             } else
488                 av_log(s, AV_LOG_ERROR, "invalid first and last sample values\n");
489         }
490         ret = av_get_packet(pb, pkt, pkt_len);
491         if (skip)
492             avio_skip(pb, skip);
493         pkt->stream_index = stream_index;
494         pkt->dts = field_nr;
495
496         //set duration manually for DV or else lavf misdetects the frame rate
497         if (st->codec->codec_id == AV_CODEC_ID_DVVIDEO)
498             pkt->duration = si->fields_per_frame;
499
500         return ret;
501     }
502     return AVERROR(EIO);
503 }
504
505 static int gxf_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) {
506     int res = 0;
507     uint64_t pos;
508     uint64_t maxlen = 100 * 1024 * 1024;
509     AVStream *st = s->streams[0];
510     int64_t start_time = s->streams[stream_index]->start_time;
511     int64_t found;
512     int idx;
513     if (timestamp < start_time) timestamp = start_time;
514     idx = av_index_search_timestamp(st, timestamp - start_time,
515                                     AVSEEK_FLAG_ANY | AVSEEK_FLAG_BACKWARD);
516     if (idx < 0)
517         return -1;
518     pos = st->index_entries[idx].pos;
519     if (idx < st->nb_index_entries - 2)
520         maxlen = st->index_entries[idx + 2].pos - pos;
521     maxlen = FFMAX(maxlen, 200 * 1024);
522     res = avio_seek(s->pb, pos, SEEK_SET);
523     if (res < 0)
524         return res;
525     found = gxf_resync_media(s, maxlen, -1, timestamp);
526     if (FFABS(found - timestamp) > 4)
527         return -1;
528     return 0;
529 }
530
531 static int64_t gxf_read_timestamp(AVFormatContext *s, int stream_index,
532                                   int64_t *pos, int64_t pos_limit) {
533     AVIOContext *pb = s->pb;
534     int64_t res;
535     if (avio_seek(pb, *pos, SEEK_SET) < 0)
536         return AV_NOPTS_VALUE;
537     res = gxf_resync_media(s, pos_limit - *pos, -1, -1);
538     *pos = avio_tell(pb);
539     return res;
540 }
541
542 AVInputFormat ff_gxf_demuxer = {
543     .name           = "gxf",
544     .long_name      = NULL_IF_CONFIG_SMALL("GXF (General eXchange Format)"),
545     .priv_data_size = sizeof(struct gxf_stream_info),
546     .read_probe     = gxf_probe,
547     .read_header    = gxf_header,
548     .read_packet    = gxf_packet,
549     .read_seek      = gxf_seek,
550     .read_timestamp = gxf_read_timestamp,
551 };