1 /*
2 * GXF muxer.
3 * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
31
32 #define GXF_AUDIO_PACKET_SIZE 65536
33
34 #define GXF_TIMECODE(c, d, h, m, s, f) \
35 ((c) << 30 | (d) << 29 | (h) << 24 | (m) << 16 | (s) << 8 | (f))
36
45
62 unsigned order;
///< interleaving order
64
80 unsigned *
flt_entries;
///< offsets of packets /1024, starts after 2nd video field
87
88 static const struct {
91 { 480, 1 }, /* NTSC */
92 { 512, 1 }, /* NTSC + VBI */
93 { 576, 2 }, /* PAL */
94 { 608, 2 }, /* PAL + VBI */
95 { 1080, 4 },
96 { 720, 6 },
97 };
98
111 //{ AV_CODEC_ID_NONE, , 18 }, /* Non compressed 24 bit audio */
116 };
117
118 #define SERVER_PATH "EXT:/PDR/default/"
119 #define ES_NAME_PATTERN "EXT:/PDR/default/ES."
120
122 {
124 int i;
125
126 for (i = 0; i < 6; ++i) {
129 return 0;
130 }
131 }
132 return -1;
133 }
134
136 {
137 for (; to_pad > 0; to_pad--) {
139 }
140 }
141
143 {
144 int64_t curpos;
146
148 if (size % 4) {
151 }
156 return curpos - pos;
157 }
158
160 {
161 int64_t curpos;
162
167 return curpos - pos;
168 }
169
171 {
172 avio_wb32(pb, 0);
/* packet leader for synchro */
174 avio_w8(pb, type);
/* map packet */
177 avio_w8(pb, 0xE1);
/* trailer 1 */
178 avio_w8(pb, 0xE2);
/* trailer 2 */
179 }
180
182 {
185 int size, starting_line;
186
195 }
197 sc->
p_per_gop = 9;
/* ensure value won't take more than one char */
199 sc->
b_per_i_or_p = 9;
/* ensure value won't take more than one char */
200 }
202 starting_line = 7; // VBI
204 starting_line = 20;
205 else
206 starting_line = 23; // default PAL
207
208 size =
snprintf(buffer,
sizeof(buffer),
"Ver 1\nBr %.6f\nIpg 1\nPpi %d\nBpiop %d\n"
209 "Pix 0\nCf %d\nCg %d\nSl %d\nnl16 %d\nVi 1\nf1 1\n",
217 return size + 3;
218 }
219
221 {
222 int64_t track_aux_data = 0;
223
227 track_aux_data |= 0x01; /* marks stream as DVCAM instead of DVPRO */
228 track_aux_data |= 0x40000000; /* aux data is valid */
230 return 8;
231 }
232
234 {
238
242 /* reserved */
244 return 8;
245 }
246
248 {
251 int64_t pos;
252
253 /* track description section */
256
259
260 /* media file name */
266
268 case 3: /* timecode */
270 break;
271 case 4: /* MPEG2 */
272 case 9: /* MPEG1 */
274 break;
275 case 5: /* DV25 */
276 case 6: /* DV50 */
278 break;
279 default:
283 }
284
285 /* file system version */
289
290 /* frame rate */
294
295 /* lines per frame */
299
300 /* fields per frame */
304
306 }
307
309 {
312 int64_t pos;
314 const char *filename = strrchr(s->
filename,
'/');
315
318
319 /* name */
320 if (filename)
321 filename++;
322 else
324 len = strlen(filename);
325
331
332 /* first field */
336
337 /* last field */
341
342 /* reserved */
346
350
351 /* estimated size */
355
357 }
358
360 {
363 int64_t pos;
364 int i;
365
370
372
374 }
375
377 {
381
382 if (!rewrite) {
384 int err;
390 return err;
391 }
392 }
394 }
395
397
398 /* preamble */
399 avio_w8(pb, 0xE0);
/* version */
400 avio_w8(pb, 0xFF);
/* reserved */
401
404
406 }
407
409 {
413 int fields_per_flt = (gxf->
nb_fields+1) / 1000 + 1;
414 int flt_entries = gxf->
nb_fields / fields_per_flt;
415 int i = 0;
416
418
419 avio_wl32(pb, fields_per_flt);
/* number of fields */
420 avio_wl32(pb, flt_entries);
/* number of active flt entries */
421
423 for (i = 0; i < flt_entries; i++)
425 }
426
427 for (; i < 1000; i++)
429
431 }
432
434 {
437 int timecode_base = gxf->
time_base.
den == 60000 ? 60 : 50;
438 int64_t timestamp = 0;
440 uint64_t nb_fields;
441 uint32_t timecode_in; // timecode at mark in
442 uint32_t timecode_out; // timecode at mark out
443
446
450
452 gxf->
tc.
hh * (timecode_base * 3600) +
453 gxf->
tc.
mm * (timecode_base * 60) +
454 gxf->
tc.
ss * timecode_base +
456
458 nb_fields / (timecode_base * 3600) % 24,
459 nb_fields / (timecode_base * 60) % 60,
460 nb_fields / timecode_base % 60,
461 nb_fields % timecode_base);
462
468 avio_wl32(pb, timecode_in);
/* timecode mark in */
469 avio_wl32(pb, timecode_out);
/* timecode mark out */
470 avio_wl64(pb, timestamp);
/* modification time */
471 avio_wl64(pb, timestamp);
/* creation time */
475 avio_wl16(pb, 1);
/* timecode track count */
478 return 48;
479 }
480
482 {
485
498 return 48;
499 }
500
502 {
506 int i;
507
513 }
514
517
519 }
520
522 {
524
527 else
530 avio_wl32(pb, 3);
/* top = 1, bottom = 2, frame = 3, unknown = 0 */
531 avio_wl32(pb, 1);
/* I picture per GOP */
538 else
541 return 32;
542 }
543
545 {
554 return 32;
555 }
556
558 {
559 int dv_umf_data = 0;
560
562 dv_umf_data |= 0x20; /* marks as DVCAM instead of DVPRO */
571 return 32;
572 }
573
575 {
578 avio_wl32(pb, 0);
/* number of fields over which to ramp up sound level */
579 avio_wl32(pb, 0);
/* number of fields over which to ramp down sound level */
582 return 32;
583 }
584
586 {
589 int64_t pos;
590 int i, j;
591
596 int64_t startpos, curpos;
597
600 else
602
609 avio_wl32(pb, 0);
/* attributes rw, ro */
620
623 else {
629 break;
632 break;
635 break;
636 }
637 }
638
643 }
645 }
646
648 {
652
654
655 /* preamble */
656 avio_w8(pb, 3);
/* first and last (only) packet */
658
666 }
667
669
671 {
672 if (!vsc)
673 return;
674
683 }
684
686 {
688
689 if (sscanf(tcstr,
"%d:%d:%d%c%d", &tc->
hh, &tc->
mm, &tc->
ss, &c, &tc->
ff) != 5) {
691 "syntax: hh:mm:ss[:;.]ff\n");
692 return -1;
693 }
694
697
698 if (fields == 2)
700
701 return 0;
702 }
703
705 {
710 int i, media_info = 0;
713
715 av_log(s,
AV_LOG_ERROR,
"gxf muxer does not support streamed output, patch welcome\n");
716 return -1;
717 }
718
719 gxf->
flags |= 0x00080000;
/* material is simple clip */
723 if (!sc)
726
731 return -1;
732 }
735 return -1;
736 }
739 return -1;
740 }
749 gxf->
flags |= 0x04000000;
/* audio is 16 bit pcm */
750 media_info = 'A';
752 if (i != 0) {
754 return -1;
755 }
756 /* FIXME check from time_base ? */
760 gxf->
flags |= 0x00000080;
766 gxf->
flags |= 0x00000040;
768 } else {
770 "gxf muxer only accepts PAL or NTSC resolutions currently\n");
771 return -1;
772 }
773 if (!tcr)
779 sc->
fields = 2;
/* interlaced */
780
781 vsc = sc;
782
786 gxf->
flags |= 0x00004000;
787 media_info = 'J';
788 break;
792 media_info = 'L';
793 break;
798 gxf->
flags |= 0x00008000;
799 media_info = 'M';
800 break;
805 gxf->
flags |= 0x00002000;
806 media_info = 'E';
807 } else {
809 gxf->
flags |= 0x00001000;
810 media_info = 'D';
811 }
812 break;
813 default:
815 return -1;
816 }
817 }
818 /* FIXME first 10 audio tracks are 0 to 9 next 22 are A to V */
819 sc->
media_info = media_info<<8 | (
'0'+tracks[media_info]++);
821 }
822
824 return -1;
825
826 if (tcr && vsc)
828
830 gxf->
flags |= 0x200000;
// time code track is non-drop frame
831
836
838
840 return 0;
841 }
842
844 {
846
849 }
850
852 {
856 int i;
858
860
864 /* overwrite map, flt and umf packets with new values */
870 /* update duration in all map packets */
876 }
877
879
882
883 return 0;
884 }
885
887 {
889 int i;
890 for(i=0; i<size-4 && c!=0x100; i++){
891 c = (c<<8) + buf[i];
894 }
895 return (buf[i+1]>>3)&7;
896 }
897
899 {
904 unsigned field_nb;
905 /* If the video is frame-encoded, the frame numbers shall be represented by
906 * even field numbers.
907 * see SMPTE360M-2004 6.4.2.1.3 Media field number */
910 } else {
913 }
914
929 } else {
932 }
937 } else
942 return 16;
943 }
944
946 {
951 int padding = 0;
952 unsigned packet_start_offset =
avio_tell(pb) / 1024;
954
957 padding = 4 - pkt->
size % 4;
963
966 int err;
973 return err;
974 }
975 }
978 }
979
981
987 }
988
989 return 0;
990 }
991
993 {
996 int i, field_nb[2];
998
999 for (i = 0; i < 2; i++) {
1005 field_nb[i] &= ~1; // compare against even field number because audio must be before video
1006 } else
1007 field_nb[i] = pkt[i]->
dts;
// dts are field based
1008 }
1009
1010 return field_nb[1] > field_nb[0] ||
1011 (field_nb[1] == field_nb[0] && sc[1]->
order > sc[0]->
order);
1012 }
1013
1015 {
1017 pkt->
duration = 2;
// enforce 2 fields
1020 }
1021
1025 .extensions = "gxf",
1033 };