annotate mxfenc.c @ 4387:5c42816e12c6 libavformat

Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This allows these functions to peek back and retrieve values from the demuxer's context (or RTSPState). The ASF/RTP payload parser will use this to be able to parse SDP values (which occur even before the payload ID is given), store them in the RTSPState and then retrieve them while parsing payload data. See "[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet() function pointer (was: transport context)" mailinglist thread.
author rbultje
date Fri, 06 Feb 2009 01:37:19 +0000
parents e8e064a00ea5
children 87a896580005
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1 /*
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
2 * MXF muxer
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
3 * Copyright (c) 2008 GUCAS, Zhentan Feng <spyfeng at gmail dot com>
4325
56f0e5097632 add my copyright as well
bcoudurier
parents: 4324
diff changeset
4 * Copyright (c) 2008 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
5 *
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
6 * This file is part of FFmpeg.
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
7 *
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
12 *
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
16 * Lesser General Public License for more details.
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
17 *
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
21 */
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
22
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
23 /*
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
24 * References
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
25 * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
26 * SMPTE 377M MXF File Format Specifications
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
27 * SMPTE 379M MXF Generic Container
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
28 * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
29 * SMPTE RP210: SMPTE Metadata Dictionary
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
30 * SMPTE RP224: Registry of SMPTE Universal Labels
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
31 */
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
32
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
33 //#define DEBUG
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
34
4363
8142fb82cd75 be more flexible with frame rate check
bcoudurier
parents: 4351
diff changeset
35 #include <math.h>
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
36 #include <time.h>
4363
8142fb82cd75 be more flexible with frame rate check
bcoudurier
parents: 4351
diff changeset
37
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
38 #include "libavutil/fifo.h"
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
39 #include "mxf.h"
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
40
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
41 static const int NTSC_samples_per_frame[] = { 1602, 1601, 1602, 1601, 1602, 0 };
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
42 static const int PAL_samples_per_frame[] = { 1920, 0 };
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
43
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
44 #define MXF_INDEX_CLUSTER_SIZE 4096
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
45
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
46 typedef struct {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
47 AVFifoBuffer fifo;
4323
982d24f6d8f6 cosmetics, align vertically
bcoudurier
parents: 4322
diff changeset
48 unsigned fifo_size; ///< current fifo size allocated
982d24f6d8f6 cosmetics, align vertically
bcoudurier
parents: 4322
diff changeset
49 uint64_t dts; ///< current dts
982d24f6d8f6 cosmetics, align vertically
bcoudurier
parents: 4322
diff changeset
50 int sample_size; ///< size of one sample all channels included
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
51 const int *samples_per_frame; ///< must be 0 terminated
4323
982d24f6d8f6 cosmetics, align vertically
bcoudurier
parents: 4322
diff changeset
52 const int *samples; ///< current samples per frame, pointer to samples_per_frame
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
53 AVRational time_base; ///< time base of output audio packets
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
54 } AudioInterleaveContext;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
55
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
56 typedef struct {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
57 int local_tag;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
58 UID uid;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
59 } MXFLocalTagPair;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
60
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
61 typedef struct {
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
62 uint8_t flags;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
63 uint64_t offset;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
64 unsigned slice_offset[17]; // one video, 16 audio
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
65 } MXFIndexEntry;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
66
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
67 typedef struct {
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
68 AudioInterleaveContext aic;
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
69 UID track_essence_element_key;
4324
00db0c2b2cde fix doxygen tag
bcoudurier
parents: 4323
diff changeset
70 int index; ///< index in mxf_essence_container_uls table
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
71 const UID *codec_ul;
3834
d49f55ab650c set duration to distinguished value
bcoudurier
parents: 3833
diff changeset
72 int64_t duration;
4323
982d24f6d8f6 cosmetics, align vertically
bcoudurier
parents: 4322
diff changeset
73 int order; ///< interleaving order if dts are equal
982d24f6d8f6 cosmetics, align vertically
bcoudurier
parents: 4322
diff changeset
74 int interlaced; ///< wether picture is interlaced
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
75 int temporal_reordering;
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
76 } MXFStreamContext;
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
77
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
78 typedef struct {
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
79 UID container_ul;
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
80 UID element_ul;
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
81 UID codec_ul;
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
82 void (*write_desc)();
3847
b104a66d828e cosmetics, Pair -> Entry
bcoudurier
parents: 3846
diff changeset
83 } MXFContainerEssenceEntry;
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
84
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
85 static const struct {
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
86 enum CodecID id;
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
87 int index;
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
88 } mxf_essence_mappings[] = {
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
89 { CODEC_ID_MPEG2VIDEO, 0 },
4346
0a142b4b841e 24bit pcm support
bcoudurier
parents: 4345
diff changeset
90 { CODEC_ID_PCM_S24LE, 1 },
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
91 { CODEC_ID_PCM_S16LE, 1 },
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
92 { 0 }
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
93 };
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
94
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
95 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st);
4320
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
96 static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st);
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
97 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st);
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
98
3847
b104a66d828e cosmetics, Pair -> Entry
bcoudurier
parents: 3846
diff changeset
99 static const MXFContainerEssenceEntry mxf_essence_container_uls[] = {
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
100 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 },
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
101 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
102 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 },
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
103 mxf_write_mpegvideo_desc },
4320
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
104 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 },
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
105 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x03,0x00 },
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
106 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
107 mxf_write_aes3_desc },
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
108 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 },
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
109 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x01,0x00 },
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
110 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
111 mxf_write_wav_desc },
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
112 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
113 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
114 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
115 NULL },
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
116 };
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
117
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
118 typedef struct MXFContext {
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
119 int64_t footer_partition_offset;
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
120 int essence_container_count;
4001
fcb9de59245f uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 3908
diff changeset
121 uint8_t essence_containers_indices[FF_ARRAY_ELEMS(mxf_essence_container_uls)];
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
122 AVRational time_base;
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
123 int header_written;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
124 MXFIndexEntry *index_entries;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
125 unsigned edit_units_count;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
126 int edit_unit_start; ///< index of the stream starting edit unit
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
127 uint64_t timestamp; ///< timestamp, as year(16),month(8),day(8),hour(8),minutes(8),msec/4(8)
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
128 } MXFContext;
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
129
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
130 static const uint8_t uuid_base[] = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd };
4012
2040c6c46c3c fix umid base value, use revision 5 and generic material type
bcoudurier
parents: 4011
diff changeset
131 static const uint8_t umid_base[] = { 0x06,0x0A,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x01,0x0D,0x00,0x13,0x00,0x00,0x00 };
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
132
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
133 /**
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
134 * complete key for operation pattern, partitions, and primer pack
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
135 */
4351
e9b7237e3f3d cosmetics: whitespaces, empty lines
bcoudurier
parents: 4350
diff changeset
136 static const uint8_t op1a_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x01,0x01,0x00 };
e9b7237e3f3d cosmetics: whitespaces, empty lines
bcoudurier
parents: 4350
diff changeset
137 static const uint8_t footer_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }; // ClosedComplete
e9b7237e3f3d cosmetics: whitespaces, empty lines
bcoudurier
parents: 4350
diff changeset
138 static const uint8_t primer_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x05,0x01,0x00 };
e9b7237e3f3d cosmetics: whitespaces, empty lines
bcoudurier
parents: 4350
diff changeset
139 static const uint8_t index_table_segment_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 };
e9b7237e3f3d cosmetics: whitespaces, empty lines
bcoudurier
parents: 4350
diff changeset
140 static const uint8_t random_index_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x11,0x01,0x00 };
3839
2b1b25134815 header partition is open incomplete for now
bcoudurier
parents: 3838
diff changeset
141 static const uint8_t header_open_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x02,0x01,0x00 }; // OpenIncomplete
2b1b25134815 header partition is open incomplete for now
bcoudurier
parents: 3838
diff changeset
142 static const uint8_t header_closed_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x02,0x04,0x00 }; // ClosedComplete
2b1b25134815 header partition is open incomplete for now
bcoudurier
parents: 3838
diff changeset
143
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
144 /**
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
145 * partial key for header metadata
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
146 */
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
147 static const uint8_t header_metadata_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01 };
4351
e9b7237e3f3d cosmetics: whitespaces, empty lines
bcoudurier
parents: 4350
diff changeset
148 static const uint8_t multiple_desc_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x0D,0x01,0x03,0x01,0x02,0x7F,0x01,0x00 };
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
149
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
150 /**
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
151 * SMPTE RP210 http://www.smpte-ra.org/mdd/index.html
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
152 */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
153 static const MXFLocalTagPair mxf_local_tag_batch[] = {
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
154 // preface set
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
155 { 0x3C0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x02,0x00,0x00,0x00,0x00}}, /* Instance UID */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
156 { 0x3B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x04,0x00,0x00}}, /* Last Modified Date */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
157 { 0x3B05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x01,0x02,0x01,0x05,0x00,0x00,0x00}}, /* Version */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
158 { 0x3B06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x04,0x00,0x00}}, /* Identifications reference */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
159 { 0x3B03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x01,0x00,0x00}}, /* Content Storage reference */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
160 { 0x3B09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x03,0x00,0x00,0x00,0x00}}, /* Operational Pattern UL */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
161 { 0x3B0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x01,0x00,0x00}}, /* Essence Containers UL batch */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
162 { 0x3B0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x02,0x00,0x00}}, /* DM Schemes UL batch */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
163 // Identification
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
164 { 0x3C09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x01,0x00,0x00,0x00}}, /* This Generation UID */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
165 { 0x3C01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x02,0x01,0x00,0x00}}, /* Company Name */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
166 { 0x3C02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x03,0x01,0x00,0x00}}, /* Product Name */
3792
a6d4e93e171b fix version string ul
bcoudurier
parents: 3780
diff changeset
167 { 0x3C04, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x05,0x01,0x00,0x00}}, /* Version String */
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
168 { 0x3C05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x07,0x00,0x00,0x00}}, /* Product ID */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
169 { 0x3C06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x03,0x00,0x00}}, /* Modification Date */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
170 // Content Storage
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
171 { 0x1901, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x01,0x00,0x00}}, /* Package strong reference batch */
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
172 { 0x1902, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x02,0x00,0x00}}, /* Package strong reference batch */
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
173 // Essence Container Data
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
174 { 0x2701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x06,0x01,0x00,0x00,0x00}}, /* Linked Package UID */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
175 { 0x3F07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x04,0x00,0x00,0x00,0x00}}, /* BodySID */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
176 // Package
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
177 { 0x4401, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x10,0x00,0x00,0x00,0x00}}, /* Package UID */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
178 { 0x4405, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x01,0x03,0x00,0x00}}, /* Package Creation Date */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
179 { 0x4404, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x05,0x00,0x00}}, /* Package Modified Date */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
180 { 0x4403, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x05,0x00,0x00}}, /* Tracks Strong reference array */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
181 { 0x4701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x03,0x00,0x00}}, /* Descriptor */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
182 // Track
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
183 { 0x4801, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x07,0x01,0x01,0x00,0x00,0x00,0x00}}, /* Track ID */
3827
e206d10f28db fix track number ul in primer pack
bcoudurier
parents: 3826
diff changeset
184 { 0x4804, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x04,0x01,0x03,0x00,0x00,0x00,0x00}}, /* Track Number */
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
185 { 0x4B01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x30,0x04,0x05,0x00,0x00,0x00,0x00}}, /* Edit Rate */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
186 { 0x4B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x03,0x00,0x00}}, /* Origin */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
187 { 0x4803, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x04,0x00,0x00}}, /* Sequence reference */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
188 // Sequence
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
189 { 0x0201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x07,0x01,0x00,0x00,0x00,0x00,0x00}}, /* Data Definition UL */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
190 { 0x0202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x02,0x01,0x01,0x03,0x00,0x00}}, /* Duration */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
191 { 0x1001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x09,0x00,0x00}}, /* Structural Components reference array */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
192 // Source Clip
4010
de8c9fae9f5c fix start position UL
bcoudurier
parents: 4001
diff changeset
193 { 0x1201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x01,0x03,0x01,0x04,0x00,0x00}}, /* Start position */
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
194 { 0x1101, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x01,0x00,0x00,0x00}}, /* SourcePackageID */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
195 { 0x1102, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x02,0x00,0x00,0x00}}, /* SourceTrackID */
3794
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
196 // File Descriptor
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
197 { 0x3F01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x04,0x06,0x0B,0x00,0x00}}, /* Sub Descriptors reference array */
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
198 { 0x3006, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x06,0x01,0x01,0x03,0x05,0x00,0x00,0x00}}, /* Linked Track ID */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
199 { 0x3001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x00,0x00,0x00,0x00}}, /* SampleRate */
3794
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
200 { 0x3004, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x01,0x02,0x00,0x00}}, /* Essence Container */
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
201 // Generic Picture Essence Descriptor
4321
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
202 { 0x320C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Frame Layout */
4322
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
203 { 0x320D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x03,0x02,0x05,0x00,0x00,0x00}}, /* Video Line Map */
3794
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
204 { 0x3203, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x02,0x00,0x00,0x00}}, /* Stored Width */
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
205 { 0x3202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x01,0x00,0x00,0x00}}, /* Stored Height */
4335
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
206 { 0x3209, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0C,0x00,0x00,0x00}}, /* Display Width */
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
207 { 0x3208, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0B,0x00,0x00,0x00}}, /* Display Height */
3794
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
208 { 0x320E, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x00,0x00,0x00}}, /* Aspect Ratio */
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
209 { 0x3201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x06,0x01,0x00,0x00,0x00,0x00}}, /* Picture Essence Coding */
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
210 // Generic Sound Essence Descriptor
4318
a7d69a322311 thanks to interleaving, audio is now locked
bcoudurier
parents: 4317
diff changeset
211 { 0x3D02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Locked/Unlocked */
3794
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
212 { 0x3D03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x01,0x01,0x01,0x00,0x00}}, /* Audio sampling rate */
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
213 { 0x3D07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x01,0x01,0x04,0x00,0x00,0x00}}, /* ChannelCount */
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
214 { 0x3D01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x03,0x04,0x00,0x00,0x00}}, /* Quantization bits */
4011
eeb2b9dd42ea fix sound essence compression UL
bcoudurier
parents: 4010
diff changeset
215 { 0x3D06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x02,0x04,0x02,0x00,0x00,0x00,0x00}}, /* Sound Essence Compression */
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
216 // Index Table Segment
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
217 { 0x3F0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x05,0x30,0x04,0x06,0x00,0x00,0x00,0x00}}, /* Index Edit Rate */
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
218 { 0x3F0C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x01,0x03,0x01,0x0A,0x00,0x00}}, /* Index Start Position */
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
219 { 0x3F0D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x02,0x01,0x01,0x02,0x00,0x00}}, /* Index Duration */
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
220 { 0x3F05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x06,0x02,0x01,0x00,0x00,0x00,0x00,0x00}}, /* Edit Unit Byte Count */
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
221 { 0x3F06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x05,0x00,0x00,0x00,0x00}}, /* IndexSID */
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
222 { 0x3F08, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x04,0x04,0x01,0x01,0x00,0x00,0x00}}, /* Slice Count */
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
223 { 0x3F09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x01,0x06,0x00,0x00,0x00}}, /* Delta Entry Array */
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
224 { 0x3F0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x02,0x05,0x00,0x00,0x00}}, /* Index Entry Array */
4336
87455a164f2b write bitrate tag
bcoudurier
parents: 4335
diff changeset
225 // MPEG video Descriptor
87455a164f2b write bitrate tag
bcoudurier
parents: 4335
diff changeset
226 { 0x8000, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0B,0x00,0x00}}, /* BitRate */
4339
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
227 // Wave Audio Essence Descriptor
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
228 { 0x3D09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x03,0x05,0x00,0x00,0x00}}, /* Average Bytes Per Second */
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
229 { 0x3D0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x02,0x01,0x00,0x00,0x00}}, /* Block Align */
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
230 };
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
231
3844
b597c00051a6 fix type in prototype
bcoudurier
parents: 3843
diff changeset
232 static void mxf_write_uuid(ByteIOContext *pb, enum MXFMetadataSetType type, int value)
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
233 {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
234 put_buffer(pb, uuid_base, 12);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
235 put_be16(pb, type);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
236 put_be16(pb, value);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
237 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
238
3844
b597c00051a6 fix type in prototype
bcoudurier
parents: 3843
diff changeset
239 static void mxf_write_umid(ByteIOContext *pb, enum MXFMetadataSetType type, int value)
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
240 {
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
241 put_buffer(pb, umid_base, 16);
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
242 mxf_write_uuid(pb, type, value);
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
243 }
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
244
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
245 static void mxf_write_refs_count(ByteIOContext *pb, int ref_count)
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
246 {
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
247 put_be32(pb, ref_count);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
248 put_be32(pb, 16);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
249 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
250
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
251 static int klv_encode_ber_length(ByteIOContext *pb, uint64_t len)
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
252 {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
253 // Determine the best BER size
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
254 int size;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
255 if (len < 128) {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
256 //short form
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
257 put_byte(pb, len);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
258 return 1;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
259 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
260
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
261 size = (av_log2(len) >> 3) + 1;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
262
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
263 // long form
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
264 put_byte(pb, 0x80 + size);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
265 while(size) {
4351
e9b7237e3f3d cosmetics: whitespaces, empty lines
bcoudurier
parents: 4350
diff changeset
266 size--;
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
267 put_byte(pb, len >> 8 * size & 0xff);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
268 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
269 return 0;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
270 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
271
3818
ae0d01b63679 compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents: 3817
diff changeset
272 /*
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
273 * Get essence container ul index
3818
ae0d01b63679 compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents: 3817
diff changeset
274 */
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
275 static int mxf_get_essence_container_ul_index(enum CodecID id)
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
276 {
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
277 int i;
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
278 for (i = 0; mxf_essence_mappings[i].id; i++)
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
279 if (mxf_essence_mappings[i].id == id)
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
280 return mxf_essence_mappings[i].index;
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
281 return -1;
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
282 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
283
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
284 static void mxf_write_primer_pack(AVFormatContext *s)
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
285 {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
286 ByteIOContext *pb = s->pb;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
287 int local_tag_number, i = 0;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
288
4001
fcb9de59245f uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 3908
diff changeset
289 local_tag_number = FF_ARRAY_ELEMS(mxf_local_tag_batch);
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
290
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
291 put_buffer(pb, primer_pack_key, 16);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
292 klv_encode_ber_length(pb, local_tag_number * 18 + 8);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
293
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
294 put_be32(pb, local_tag_number); // local_tag num
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
295 put_be32(pb, 18); // item size, always 18 according to the specs
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
296
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
297 for (i = 0; i < local_tag_number; i++) {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
298 put_be16(pb, mxf_local_tag_batch[i].local_tag);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
299 put_buffer(pb, mxf_local_tag_batch[i].uid, 16);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
300 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
301 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
302
3815
af8d6067206e rename variable
bcoudurier
parents: 3814
diff changeset
303 static void mxf_write_local_tag(ByteIOContext *pb, int size, int tag)
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
304 {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
305 put_be16(pb, tag);
3815
af8d6067206e rename variable
bcoudurier
parents: 3814
diff changeset
306 put_be16(pb, size);
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
307 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
308
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
309 static void mxf_write_metadata_key(ByteIOContext *pb, unsigned int value)
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
310 {
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
311 put_buffer(pb, header_metadata_key, 13);
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
312 put_be24(pb, value);
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
313 }
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
314
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
315 static void mxf_free(AVFormatContext *s)
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
316 {
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
317 int i;
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
318
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
319 for (i = 0; i < s->nb_streams; i++) {
3823
42ed5e2f1b4b merge declaration and init
bcoudurier
parents: 3822
diff changeset
320 AVStream *st = s->streams[i];
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
321 av_freep(&st->priv_data);
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
322 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
323 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
324
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
325 static const MXFDataDefinitionUL *mxf_get_data_definition_ul(enum CodecType type)
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
326 {
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
327 const MXFDataDefinitionUL *uls = ff_mxf_data_definition_uls;
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
328 while (uls->type != CODEC_TYPE_DATA) {
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
329 if (type == uls->type)
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
330 break;
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
331 uls++;
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
332 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
333 return uls;
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
334 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
335
3821
7a1f6dd123a9 simplify mxf_write_essence_container_refs
bcoudurier
parents: 3820
diff changeset
336 static void mxf_write_essence_container_refs(AVFormatContext *s)
3780
261cd3e672e5 Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents: 3778
diff changeset
337 {
3818
ae0d01b63679 compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents: 3817
diff changeset
338 MXFContext *c = s->priv_data;
3780
261cd3e672e5 Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents: 3778
diff changeset
339 ByteIOContext *pb = s->pb;
3818
ae0d01b63679 compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents: 3817
diff changeset
340 int i;
3780
261cd3e672e5 Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents: 3778
diff changeset
341
3822
be33feb6984f reindent
bcoudurier
parents: 3821
diff changeset
342 mxf_write_refs_count(pb, c->essence_container_count);
be33feb6984f reindent
bcoudurier
parents: 3821
diff changeset
343 av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", c->essence_container_count);
be33feb6984f reindent
bcoudurier
parents: 3821
diff changeset
344 for (i = 0; i < c->essence_container_count; i++) {
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
345 put_buffer(pb, mxf_essence_container_uls[c->essence_containers_indices[i]].container_ul, 16);
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
346 PRINT_KEY(s, "essence container ul:\n", mxf_essence_container_uls[c->essence_containers_indices[i]].container_ul);
3822
be33feb6984f reindent
bcoudurier
parents: 3821
diff changeset
347 }
3780
261cd3e672e5 Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents: 3778
diff changeset
348 }
261cd3e672e5 Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents: 3778
diff changeset
349
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
350 static void mxf_write_preface(AVFormatContext *s)
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
351 {
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
352 MXFContext *mxf = s->priv_data;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
353 ByteIOContext *pb = s->pb;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
354
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
355 mxf_write_metadata_key(pb, 0x012f00);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
356 PRINT_KEY(s, "preface key", pb->buf_ptr - 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
357 klv_encode_ber_length(pb, 130 + 16 * mxf->essence_container_count);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
358
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
359 // write preface set uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
360 mxf_write_local_tag(pb, 16, 0x3C0A);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
361 mxf_write_uuid(pb, Preface, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
362 PRINT_KEY(s, "preface uid", pb->buf_ptr - 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
363
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
364 // last modified date
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
365 mxf_write_local_tag(pb, 8, 0x3B02);
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
366 put_be64(pb, mxf->timestamp);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
367
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
368 // write version
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
369 mxf_write_local_tag(pb, 2, 0x3B05);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
370 put_be16(pb, 1);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
371
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
372 // write identification_refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
373 mxf_write_local_tag(pb, 16 + 8, 0x3B06);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
374 mxf_write_refs_count(pb, 1);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
375 mxf_write_uuid(pb, Identification, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
376
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
377 // write content_storage_refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
378 mxf_write_local_tag(pb, 16, 0x3B03);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
379 mxf_write_uuid(pb, ContentStorage, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
380
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
381 mxf_write_local_tag(pb, 16, 0x3B09);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
382 put_buffer(pb, op1a_ul, 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
383
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
384 // write essence_container_refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
385 mxf_write_local_tag(pb, 8 + 16 * mxf->essence_container_count, 0x3B0A);
3821
7a1f6dd123a9 simplify mxf_write_essence_container_refs
bcoudurier
parents: 3820
diff changeset
386 mxf_write_essence_container_refs(s);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
387
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
388 // write dm_scheme_refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
389 mxf_write_local_tag(pb, 8, 0x3B0B);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
390 put_be64(pb, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
391 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
392
3804
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
393 /*
3806
fa043e93fc66 introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents: 3805
diff changeset
394 * Write a local tag containing an ascii string as utf-16
3804
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
395 */
3806
fa043e93fc66 introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents: 3805
diff changeset
396 static void mxf_write_local_tag_utf16(ByteIOContext *pb, int tag, const char *value)
3804
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
397 {
3805
d8a6432c76f3 use strlen and do not write useless trailing 0 according to specs
bcoudurier
parents: 3804
diff changeset
398 int i, size = strlen(value);
3806
fa043e93fc66 introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents: 3805
diff changeset
399 mxf_write_local_tag(pb, size*2, tag);
3804
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
400 for (i = 0; i < size; i++)
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
401 put_be16(pb, value[i]);
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
402 }
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
403
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
404 static void mxf_write_identification(AVFormatContext *s)
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
405 {
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
406 MXFContext *mxf = s->priv_data;
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
407 ByteIOContext *pb = s->pb;
3810
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
408 const char *company = "FFmpeg";
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
409 const char *product = "OP1a Muxer";
3807
24113c3ebeaf always write required version string local tag
bcoudurier
parents: 3806
diff changeset
410 const char *version;
3810
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
411 int length;
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
412
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
413 mxf_write_metadata_key(pb, 0x013000);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
414 PRINT_KEY(s, "identification key", pb->buf_ptr - 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
415
3808
dd88c58a4432 simplify
bcoudurier
parents: 3807
diff changeset
416 version = s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT ?
3809
22b984b6cec1 only put version in tag
bcoudurier
parents: 3808
diff changeset
417 "0.0.0" : AV_STRINGIFY(LIBAVFORMAT_VERSION);
3810
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
418 length = 84 + (strlen(company)+strlen(product)+strlen(version))*2; // utf-16
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
419 klv_encode_ber_length(pb, length);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
420
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
421 // write uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
422 mxf_write_local_tag(pb, 16, 0x3C0A);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
423 mxf_write_uuid(pb, Identification, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
424 PRINT_KEY(s, "identification uid", pb->buf_ptr - 16);
3811
0daa9773c9c3 cosmetics
bcoudurier
parents: 3810
diff changeset
425
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
426 // write generation uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
427 mxf_write_local_tag(pb, 16, 0x3C09);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
428 mxf_write_uuid(pb, Identification, 1);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
429
3810
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
430 mxf_write_local_tag_utf16(pb, 0x3C01, company); // Company Name
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
431 mxf_write_local_tag_utf16(pb, 0x3C02, product); // Product Name
3807
24113c3ebeaf always write required version string local tag
bcoudurier
parents: 3806
diff changeset
432 mxf_write_local_tag_utf16(pb, 0x3C04, version); // Version String
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
433
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
434 // write product uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
435 mxf_write_local_tag(pb, 16, 0x3C05);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
436 mxf_write_uuid(pb, Identification, 2);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
437
4384
bfb10be2b631 use timestamp as modification date
bcoudurier
parents: 4382
diff changeset
438 // modification date
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
439 mxf_write_local_tag(pb, 8, 0x3C06);
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
440 put_be64(pb, mxf->timestamp);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
441 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
442
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
443 static void mxf_write_content_storage(AVFormatContext *s)
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
444 {
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
445 ByteIOContext *pb = s->pb;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
446
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
447 mxf_write_metadata_key(pb, 0x011800);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
448 PRINT_KEY(s, "content storage key", pb->buf_ptr - 16);
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
449 klv_encode_ber_length(pb, 92);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
450
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
451 // write uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
452 mxf_write_local_tag(pb, 16, 0x3C0A);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
453 mxf_write_uuid(pb, ContentStorage, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
454 PRINT_KEY(s, "content storage uid", pb->buf_ptr - 16);
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
455
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
456 // write package reference
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
457 mxf_write_local_tag(pb, 16 * 2 + 8, 0x1901);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
458 mxf_write_refs_count(pb, 2);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
459 mxf_write_uuid(pb, MaterialPackage, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
460 mxf_write_uuid(pb, SourcePackage, 0);
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
461
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
462 // write essence container data
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
463 mxf_write_local_tag(pb, 8 + 16, 0x1902);
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
464 mxf_write_refs_count(pb, 1);
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
465 mxf_write_uuid(pb, EssenceContainerData, 0);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
466 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
467
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
468 static void mxf_write_track(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
469 {
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
470 MXFContext *mxf = s->priv_data;
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
471 ByteIOContext *pb = s->pb;
3823
42ed5e2f1b4b merge declaration and init
bcoudurier
parents: 3822
diff changeset
472 MXFStreamContext *sc = st->priv_data;
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
473
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
474 mxf_write_metadata_key(pb, 0x013b00);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
475 PRINT_KEY(s, "track key", pb->buf_ptr - 16);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
476 klv_encode_ber_length(pb, 80);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
477
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
478 // write track uid
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
479 mxf_write_local_tag(pb, 16, 0x3C0A);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
480 mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, st->index);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
481 PRINT_KEY(s, "track uid", pb->buf_ptr - 16);
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
482
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
483 // write track id
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
484 mxf_write_local_tag(pb, 4, 0x4801);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
485 put_be32(pb, st->index);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
486
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
487 // write track number
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
488 mxf_write_local_tag(pb, 4, 0x4804);
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
489 if (type == MaterialPackage)
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
490 put_be32(pb, 0); // track number of material package is 0
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
491 else
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
492 put_buffer(pb, sc->track_essence_element_key + 12, 4);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
493
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
494 mxf_write_local_tag(pb, 8, 0x4B01);
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
495 put_be32(pb, mxf->time_base.den);
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
496 put_be32(pb, mxf->time_base.num);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
497
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
498 // write origin
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
499 mxf_write_local_tag(pb, 8, 0x4B02);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
500 put_be64(pb, 0);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
501
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
502 // write sequence refs
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
503 mxf_write_local_tag(pb, 16, 0x4803);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
504 mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
505 }
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
506
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
507 static void mxf_write_common_fields(ByteIOContext *pb, AVStream *st)
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
508 {
3823
42ed5e2f1b4b merge declaration and init
bcoudurier
parents: 3822
diff changeset
509 const MXFDataDefinitionUL *data_def_ul = mxf_get_data_definition_ul(st->codec->codec_type);
3834
d49f55ab650c set duration to distinguished value
bcoudurier
parents: 3833
diff changeset
510 MXFStreamContext *sc = st->priv_data;
d49f55ab650c set duration to distinguished value
bcoudurier
parents: 3833
diff changeset
511
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
512 // find data define uls
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
513 mxf_write_local_tag(pb, 16, 0x0201);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
514 put_buffer(pb, data_def_ul->uid, 16);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
515
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
516 // write duration
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
517 mxf_write_local_tag(pb, 8, 0x0202);
3834
d49f55ab650c set duration to distinguished value
bcoudurier
parents: 3833
diff changeset
518 put_be64(pb, sc->duration);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
519 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
520
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
521 static void mxf_write_sequence(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
522 {
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
523 ByteIOContext *pb = s->pb;
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
524
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
525 mxf_write_metadata_key(pb, 0x010f00);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
526 PRINT_KEY(s, "sequence key", pb->buf_ptr - 16);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
527 klv_encode_ber_length(pb, 80);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
528
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
529 mxf_write_local_tag(pb, 16, 0x3C0A);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
530 mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
531
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
532 PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
533 mxf_write_common_fields(pb, st);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
534
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
535 // write structural component
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
536 mxf_write_local_tag(pb, 16 + 8, 0x1001);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
537 mxf_write_refs_count(pb, 1);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
538 mxf_write_uuid(pb, type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, st->index);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
539 }
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
540
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
541 static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
542 {
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
543 ByteIOContext *pb = s->pb;
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
544 int i;
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
545
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
546 mxf_write_metadata_key(pb, 0x011100);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
547 PRINT_KEY(s, "sturctural component key", pb->buf_ptr - 16);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
548 klv_encode_ber_length(pb, 108);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
549
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
550 // write uid
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
551 mxf_write_local_tag(pb, 16, 0x3C0A);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
552 mxf_write_uuid(pb, type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, st->index);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
553
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
554 PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
555 mxf_write_common_fields(pb, st);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
556
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
557 // write start_position
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
558 mxf_write_local_tag(pb, 8, 0x1201);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
559 put_be64(pb, 0);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
560
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
561 // write source package uid, end of the reference
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
562 mxf_write_local_tag(pb, 32, 0x1101);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
563 if (type == SourcePackage) {
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
564 for (i = 0; i < 4; i++)
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
565 put_be64(pb, 0);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
566 } else
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
567 mxf_write_umid(pb, SourcePackage, 0);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
568
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
569 // write source track id
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
570 mxf_write_local_tag(pb, 4, 0x1102);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
571 if (type == SourcePackage)
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
572 put_be32(pb, 0);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
573 else
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
574 put_be32(pb, st->index);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
575 }
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
576
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
577 static void mxf_write_multi_descriptor(AVFormatContext *s)
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
578 {
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
579 MXFContext *mxf = s->priv_data;
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
580 ByteIOContext *pb = s->pb;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
581 int i;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
582
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
583 mxf_write_metadata_key(pb, 0x014400);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
584 PRINT_KEY(s, "multiple descriptor key", pb->buf_ptr - 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
585 klv_encode_ber_length(pb, 64 + 16 * s->nb_streams);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
586
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
587 mxf_write_local_tag(pb, 16, 0x3C0A);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
588 mxf_write_uuid(pb, MultipleDescriptor, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
589 PRINT_KEY(s, "multi_desc uid", pb->buf_ptr - 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
590
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
591 // write sample rate
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
592 mxf_write_local_tag(pb, 8, 0x3001);
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
593 put_be32(pb, mxf->time_base.den);
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
594 put_be32(pb, mxf->time_base.num);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
595
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
596 // write essence container ul
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
597 mxf_write_local_tag(pb, 16, 0x3004);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
598 put_buffer(pb, multiple_desc_ul, 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
599
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
600 // write sub descriptor refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
601 mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x3F01);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
602 mxf_write_refs_count(pb, s->nb_streams);
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
603 for (i = 0; i < s->nb_streams; i++)
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
604 mxf_write_uuid(pb, SubDescriptor, i);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
605 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
606
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
607 static void mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
608 {
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
609 MXFContext *mxf = s->priv_data;
3817
22831cc65a35 get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents: 3816
diff changeset
610 MXFStreamContext *sc = st->priv_data;
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
611 ByteIOContext *pb = s->pb;
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
612
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
613 put_buffer(pb, key, 16);
4315
ea947a88be91 add size param to write_generic_desc
bcoudurier
parents: 4314
diff changeset
614 klv_encode_ber_length(pb, size);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
615
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
616 mxf_write_local_tag(pb, 16, 0x3C0A);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
617 mxf_write_uuid(pb, SubDescriptor, st->index);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
618
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
619 mxf_write_local_tag(pb, 4, 0x3006);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
620 put_be32(pb, st->index);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
621
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
622 mxf_write_local_tag(pb, 8, 0x3001);
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
623 put_be32(pb, mxf->time_base.den);
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
624 put_be32(pb, mxf->time_base.num);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
625
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
626 mxf_write_local_tag(pb, 16, 0x3004);
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
627 put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
628 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
629
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
630 static const UID mxf_mpegvideo_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 };
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
631 static const UID mxf_wav_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 };
4320
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
632 static const UID mxf_aes3_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 };
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
633
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
634 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
635 {
4316
3c4392f087dc stored height is stupidly /2 if interlaced
bcoudurier
parents: 4315
diff changeset
636 MXFStreamContext *sc = st->priv_data;
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
637 ByteIOContext *pb = s->pb;
4277
a5e558f1a64f stored height is a multiple of 16 for mpeg2
bcoudurier
parents: 4012
diff changeset
638 int stored_height = (st->codec->height+15)/16*16;
4278
5bf611a311b9 reduce display aspect ratio
bcoudurier
parents: 4277
diff changeset
639 AVRational dar;
4322
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
640 int f1, f2;
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
641
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
642 mxf_write_generic_desc(s, st, mxf_mpegvideo_descriptor_key, 153+sc->interlaced*4);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
643
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
644 mxf_write_local_tag(pb, 4, 0x3203);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
645 put_be32(pb, st->codec->width);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
646
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
647 mxf_write_local_tag(pb, 4, 0x3202);
4316
3c4392f087dc stored height is stupidly /2 if interlaced
bcoudurier
parents: 4315
diff changeset
648 put_be32(pb, stored_height>>sc->interlaced);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
649
4335
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
650 mxf_write_local_tag(pb, 4, 0x3209);
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
651 put_be32(pb, st->codec->width);
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
652
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
653 mxf_write_local_tag(pb, 4, 0x3208);
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
654 put_be32(pb, st->codec->height>>sc->interlaced);
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
655
4336
87455a164f2b write bitrate tag
bcoudurier
parents: 4335
diff changeset
656 // bit rate
87455a164f2b write bitrate tag
bcoudurier
parents: 4335
diff changeset
657 mxf_write_local_tag(pb, 4, 0x8000);
87455a164f2b write bitrate tag
bcoudurier
parents: 4335
diff changeset
658 put_be32(pb, st->codec->bit_rate);
87455a164f2b write bitrate tag
bcoudurier
parents: 4335
diff changeset
659
4321
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
660 // frame layout
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
661 mxf_write_local_tag(pb, 1, 0x320C);
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
662 put_byte(pb, sc->interlaced);
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
663
4322
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
664 // video line map
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
665 switch (st->codec->height) {
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
666 case 576: f1 = 23; f2 = 336; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
667 case 608: f1 = 7; f2 = 320; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
668 case 480: f1 = 20; f2 = 283; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
669 case 512: f1 = 7; f2 = 270; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
670 case 720: f1 = 26; f2 = 0; break; // progressive
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
671 case 1080: f1 = 21; f2 = 584; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
672 default: f1 = 0; f2 = 0; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
673 }
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
674
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
675 if (!sc->interlaced) {
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
676 f2 = 0;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
677 f1 *= 2;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
678 }
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
679
4343
b691846ea95e fix video line map tag size
bcoudurier
parents: 4342
diff changeset
680 mxf_write_local_tag(pb, 12+sc->interlaced*4, 0x320D);
4337
3d3c7fbfd910 do not write f2 if not interlaced
bcoudurier
parents: 4336
diff changeset
681 put_be32(pb, sc->interlaced ? 2 : 1);
3d3c7fbfd910 do not write f2 if not interlaced
bcoudurier
parents: 4336
diff changeset
682 put_be32(pb, 4);
4322
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
683 put_be32(pb, f1);
4337
3d3c7fbfd910 do not write f2 if not interlaced
bcoudurier
parents: 4336
diff changeset
684 if (sc->interlaced)
3d3c7fbfd910 do not write f2 if not interlaced
bcoudurier
parents: 4336
diff changeset
685 put_be32(pb, f2);
4322
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
686
4278
5bf611a311b9 reduce display aspect ratio
bcoudurier
parents: 4277
diff changeset
687 av_reduce(&dar.num, &dar.den,
5bf611a311b9 reduce display aspect ratio
bcoudurier
parents: 4277
diff changeset
688 st->codec->width*st->codec->sample_aspect_ratio.num,
5bf611a311b9 reduce display aspect ratio
bcoudurier
parents: 4277
diff changeset
689 st->codec->height*st->codec->sample_aspect_ratio.den,
5bf611a311b9 reduce display aspect ratio
bcoudurier
parents: 4277
diff changeset
690 1024*1024);
5bf611a311b9 reduce display aspect ratio
bcoudurier
parents: 4277
diff changeset
691
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
692 mxf_write_local_tag(pb, 8, 0x320E);
4278
5bf611a311b9 reduce display aspect ratio
bcoudurier
parents: 4277
diff changeset
693 put_be32(pb, dar.num);
5bf611a311b9 reduce display aspect ratio
bcoudurier
parents: 4277
diff changeset
694 put_be32(pb, dar.den);
4317
b978795a9e37 local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents: 4316
diff changeset
695
b978795a9e37 local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents: 4316
diff changeset
696 mxf_write_local_tag(pb, 16, 0x3201);
b978795a9e37 local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents: 4316
diff changeset
697 put_buffer(pb, *sc->codec_ul, 16);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
698 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
699
4319
28d38c1fb5fa split wav_desc in generic_sound_desc
bcoudurier
parents: 4318
diff changeset
700 static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
701 {
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
702 ByteIOContext *pb = s->pb;
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
703
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
704 mxf_write_generic_desc(s, st, key, size);
4318
a7d69a322311 thanks to interleaving, audio is now locked
bcoudurier
parents: 4317
diff changeset
705
4319
28d38c1fb5fa split wav_desc in generic_sound_desc
bcoudurier
parents: 4318
diff changeset
706 // audio locked
4318
a7d69a322311 thanks to interleaving, audio is now locked
bcoudurier
parents: 4317
diff changeset
707 mxf_write_local_tag(pb, 1, 0x3D02);
a7d69a322311 thanks to interleaving, audio is now locked
bcoudurier
parents: 4317
diff changeset
708 put_byte(pb, 1);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
709
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
710 // write audio sampling rate
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
711 mxf_write_local_tag(pb, 8, 0x3D03);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
712 put_be32(pb, st->codec->sample_rate);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
713 put_be32(pb, 1);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
714
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
715 mxf_write_local_tag(pb, 4, 0x3D07);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
716 put_be32(pb, st->codec->channels);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
717
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
718 mxf_write_local_tag(pb, 4, 0x3D01);
4346
0a142b4b841e 24bit pcm support
bcoudurier
parents: 4345
diff changeset
719 put_be32(pb, av_get_bits_per_sample(st->codec->codec_id));
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
720 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
721
4340
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
722 static void mxf_write_wav_common_desc(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
4319
28d38c1fb5fa split wav_desc in generic_sound_desc
bcoudurier
parents: 4318
diff changeset
723 {
4339
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
724 ByteIOContext *pb = s->pb;
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
725
4340
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
726 mxf_write_generic_sound_desc(s, st, key, size);
4339
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
727
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
728 mxf_write_local_tag(pb, 2, 0x3D0A);
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
729 put_be16(pb, st->codec->block_align);
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
730
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
731 // avg bytes per sec
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
732 mxf_write_local_tag(pb, 4, 0x3D09);
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
733 put_be32(pb, st->codec->block_align*st->codec->sample_rate);
4319
28d38c1fb5fa split wav_desc in generic_sound_desc
bcoudurier
parents: 4318
diff changeset
734 }
28d38c1fb5fa split wav_desc in generic_sound_desc
bcoudurier
parents: 4318
diff changeset
735
4340
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
736 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st)
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
737 {
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
738 mxf_write_wav_common_desc(s, st, mxf_wav_descriptor_key, 107);
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
739 }
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
740
4320
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
741 static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st)
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
742 {
4340
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
743 mxf_write_wav_common_desc(s, st, mxf_aes3_descriptor_key, 107);
4320
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
744 }
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
745
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
746 static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
747 {
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
748 MXFContext *mxf = s->priv_data;
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
749 ByteIOContext *pb = s->pb;
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
750 int i;
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
751
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
752 if (type == MaterialPackage) {
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
753 mxf_write_metadata_key(pb, 0x013600);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
754 PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
755 klv_encode_ber_length(pb, 92 + 16 * s->nb_streams);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
756 } else {
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
757 mxf_write_metadata_key(pb, 0x013700);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
758 PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
759 klv_encode_ber_length(pb, 112 + 16 * s->nb_streams); // 20 bytes length for descriptor reference
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
760 }
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
761
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
762 // write uid
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
763 mxf_write_local_tag(pb, 16, 0x3C0A);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
764 mxf_write_uuid(pb, type, 0);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
765 av_log(s,AV_LOG_DEBUG, "package type:%d\n", type);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
766 PRINT_KEY(s, "package uid", pb->buf_ptr - 16);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
767
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
768 // write package umid
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
769 mxf_write_local_tag(pb, 32, 0x4401);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
770 mxf_write_umid(pb, type, 0);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
771 PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
772
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
773 // package creation date
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
774 mxf_write_local_tag(pb, 8, 0x4405);
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
775 put_be64(pb, mxf->timestamp);
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
776
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
777 // package modified date
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
778 mxf_write_local_tag(pb, 8, 0x4404);
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
779 put_be64(pb, mxf->timestamp);
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
780
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
781 // write track refs
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
782 mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x4403);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
783 mxf_write_refs_count(pb, s->nb_streams);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
784 for (i = 0; i < s->nb_streams; i++)
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
785 mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
786
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
787 // write multiple descriptor reference
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
788 if (type == SourcePackage) {
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
789 mxf_write_local_tag(pb, 16, 0x4701);
3851
9b3ad7f292a4 do no write multi descriptor when only one track is present
bcoudurier
parents: 3850
diff changeset
790 if (s->nb_streams > 1) {
9b3ad7f292a4 do no write multi descriptor when only one track is present
bcoudurier
parents: 3850
diff changeset
791 mxf_write_uuid(pb, MultipleDescriptor, 0);
9b3ad7f292a4 do no write multi descriptor when only one track is present
bcoudurier
parents: 3850
diff changeset
792 mxf_write_multi_descriptor(s);
9b3ad7f292a4 do no write multi descriptor when only one track is present
bcoudurier
parents: 3850
diff changeset
793 } else
9b3ad7f292a4 do no write multi descriptor when only one track is present
bcoudurier
parents: 3850
diff changeset
794 mxf_write_uuid(pb, SubDescriptor, 0);
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
795 }
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
796
3831
547e11f5924b cosmetics, whitespace
bcoudurier
parents: 3830
diff changeset
797 for (i = 0; i < s->nb_streams; i++) {
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
798 AVStream *st = s->streams[i];
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
799 mxf_write_track(s, st, type);
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
800 mxf_write_sequence(s, st, type);
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
801 mxf_write_structural_component(s, st, type);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
802
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
803 if (type == SourcePackage) {
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
804 MXFStreamContext *sc = st->priv_data;
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
805 mxf_essence_container_uls[sc->index].write_desc(s, st);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
806 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
807 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
808 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
809
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
810 static int mxf_write_essence_container_data(AVFormatContext *s)
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
811 {
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
812 ByteIOContext *pb = s->pb;
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
813
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
814 mxf_write_metadata_key(pb, 0x012300);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
815 klv_encode_ber_length(pb, 72);
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
816
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
817 mxf_write_local_tag(pb, 16, 0x3C0A); // Instance UID
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
818 mxf_write_uuid(pb, EssenceContainerData, 0);
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
819
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
820 mxf_write_local_tag(pb, 32, 0x2701); // Linked Package UID
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
821 mxf_write_umid(pb, SourcePackage, 0);
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
822
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
823 mxf_write_local_tag(pb, 4, 0x3F07); // BodySID
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
824 put_be32(pb, 1);
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
825
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
826 mxf_write_local_tag(pb, 4, 0x3F06); // IndexSID
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
827 put_be32(pb, 2);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
828
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
829 return 0;
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
830 }
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
831
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
832 static int mxf_write_header_metadata_sets(AVFormatContext *s)
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
833 {
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
834 mxf_write_preface(s);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
835 mxf_write_identification(s);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
836 mxf_write_content_storage(s);
3849
9dabc8338517 remove mxf_build_structural_metadata, simplify
bcoudurier
parents: 3848
diff changeset
837 mxf_write_package(s, MaterialPackage);
9dabc8338517 remove mxf_build_structural_metadata, simplify
bcoudurier
parents: 3848
diff changeset
838 mxf_write_package(s, SourcePackage);
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
839 mxf_write_essence_container_data(s);
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
840 return 0;
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
841 }
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
842
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
843 static int mxf_write_index_table_segment(AVFormatContext *s)
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
844 {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
845 MXFContext *mxf = s->priv_data;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
846 ByteIOContext *pb = s->pb;
4378
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
847 int i, j, k, ret;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
848 int temporal_reordering = 0;
4378
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
849 int last_key_index = 0, key_index = 0;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
850
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
851 av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
852
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
853 put_buffer(pb, index_table_segment_key, 16);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
854 ret = klv_encode_ber_length(pb, 109 + s->nb_streams*6 +
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
855 mxf->edit_units_count*(11+(s->nb_streams-1)*4));
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
856
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
857 // instance id
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
858 mxf_write_local_tag(pb, 16, 0x3C0A);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
859 mxf_write_uuid(pb, IndexTableSegment, 0);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
860
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
861 // index edit rate
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
862 mxf_write_local_tag(pb, 8, 0x3F0B);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
863 put_be32(pb, mxf->time_base.num);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
864 put_be32(pb, mxf->time_base.den);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
865
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
866 // index start position
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
867 mxf_write_local_tag(pb, 8, 0x3F0C);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
868 put_be64(pb, 0);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
869
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
870 // index duration
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
871 mxf_write_local_tag(pb, 8, 0x3F0D);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
872 put_be64(pb, mxf->edit_units_count);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
873
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
874 // edit unit byte count
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
875 mxf_write_local_tag(pb, 4, 0x3F05);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
876 put_be32(pb, 0);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
877
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
878 // index sid
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
879 mxf_write_local_tag(pb, 4, 0x3F06);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
880 put_be32(pb, 2);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
881
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
882 // body sid
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
883 mxf_write_local_tag(pb, 4, 0x3F07);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
884 put_be32(pb, 1);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
885
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
886 // slice count - 1
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
887 mxf_write_local_tag(pb, 1, 0x3F08);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
888 put_byte(pb, s->nb_streams-1);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
889
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
890 // delta entry array
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
891 mxf_write_local_tag(pb, 8 + s->nb_streams*6, 0x3F09);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
892 put_be32(pb, s->nb_streams); // num of entries
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
893 put_be32(pb, 6); // size of one entry
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
894 for (i = 0; i < s->nb_streams; i++) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
895 AVStream *st = s->streams[i];
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
896 MXFStreamContext *sc = st->priv_data;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
897 put_byte(pb, sc->temporal_reordering);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
898 if (sc->temporal_reordering)
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
899 temporal_reordering = 1;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
900 put_byte(pb, i);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
901 put_be32(pb, 0); // element delta
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
902 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
903
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
904 mxf_write_local_tag(pb, 8 + mxf->edit_units_count*(11+(s->nb_streams-1)*4), 0x3F0A);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
905 put_be32(pb, mxf->edit_units_count); // num of entries
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
906 put_be32(pb, 11+(s->nb_streams-1)*4); // size of one entry
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
907 for (i = 0; i < mxf->edit_units_count; i++) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
908 if (temporal_reordering) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
909 int temporal_offset = 0;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
910 for (j = i+1; j < mxf->edit_units_count; j++) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
911 temporal_offset++;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
912 if (mxf->index_entries[j].flags & 0x10) { // backward prediction
4344
582124bb2c15 fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents: 4343
diff changeset
913 // next is not b, so is reordered
582124bb2c15 fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents: 4343
diff changeset
914 if (!(mxf->index_entries[i+1].flags & 0x10)) {
582124bb2c15 fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents: 4343
diff changeset
915 if ((mxf->index_entries[i].flags & 0x11) == 0) // i frame
582124bb2c15 fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents: 4343
diff changeset
916 temporal_offset = 0;
582124bb2c15 fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents: 4343
diff changeset
917 else
582124bb2c15 fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents: 4343
diff changeset
918 temporal_offset = -temporal_offset;
582124bb2c15 fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents: 4343
diff changeset
919 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
920 break;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
921 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
922 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
923 put_byte(pb, temporal_offset);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
924 } else
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
925 put_byte(pb, 0);
4378
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
926 if (!(mxf->index_entries[i].flags & 0x33)) { // I frame
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
927 last_key_index = key_index;
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
928 key_index = i;
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
929 }
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
930 if (mxf->index_entries[i].flags & 0x10 && // backward prediction
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
931 !(mxf->index_entries[key_index].flags & 0x80)) { // open gop
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
932 put_byte(pb, last_key_index - i);
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
933 } else {
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
934 put_byte(pb, key_index - i); // key frame offset
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
935 if ((mxf->index_entries[i].flags & 0x20) == 0x20) // only forward
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
936 last_key_index = key_index;
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
937 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
938 put_byte(pb, mxf->index_entries[i].flags);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
939 // stream offset
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
940 put_be64(pb, mxf->index_entries[i].offset - mxf->index_entries[0].offset);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
941 for (k = 0; k < s->nb_streams; k++) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
942 if (mxf->index_entries[i].slice_offset[k])
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
943 put_be32(pb, mxf->index_entries[i].slice_offset[k]);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
944 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
945 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
946
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
947 return ret;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
948 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
949
4370
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
950 static void mxf_write_partition(AVFormatContext *s, int bodysid,
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
951 int indexsid, unsigned index_byte_count,
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
952 const uint8_t *key, int write_metadata)
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
953 {
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
954 MXFContext *mxf = s->priv_data;
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
955 ByteIOContext *pb = s->pb;
3843
b60ab685d415 remove header_byte_count_offset from context
bcoudurier
parents: 3842
diff changeset
956 int64_t header_byte_count_offset;
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
957
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
958 // write klv
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
959 put_buffer(pb, key, 16);
3821
7a1f6dd123a9 simplify mxf_write_essence_container_refs
bcoudurier
parents: 3820
diff changeset
960
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
961 klv_encode_ber_length(pb, 88 + 16 * mxf->essence_container_count);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
962
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
963 // write partition value
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
964 put_be16(pb, 1); // majorVersion
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
965 put_be16(pb, 2); // minorVersion
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
966 put_be32(pb, 1); // kagSize
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
967
3841
cd6c579c5651 simplify current partition offset
bcoudurier
parents: 3839
diff changeset
968 put_be64(pb, url_ftell(pb) - 25); // thisPartition
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
969 put_be64(pb, 0); // previousPartition
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
970
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
971 put_be64(pb, mxf->footer_partition_offset); // footerPartition
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
972
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
973 // set offset
3843
b60ab685d415 remove header_byte_count_offset from context
bcoudurier
parents: 3842
diff changeset
974 header_byte_count_offset = url_ftell(pb);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
975 put_be64(pb, 0); // headerByteCount, update later
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
976
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
977 // indexTable
4370
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
978 put_be64(pb, index_byte_count); // indexByteCount
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
979 put_be32(pb, indexsid); // indexSID
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
980 put_be64(pb, 0); // bodyOffset
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
981
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
982 put_be32(pb, bodysid); // bodySID
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
983 put_buffer(pb, op1a_ul, 16); // operational pattern
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
984
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
985 // essence container
3821
7a1f6dd123a9 simplify mxf_write_essence_container_refs
bcoudurier
parents: 3820
diff changeset
986 mxf_write_essence_container_refs(s);
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
987
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
988 if (write_metadata) {
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
989 // mark the start of the headermetadata and calculate metadata size
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
990 int64_t pos, start = url_ftell(s->pb);
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
991 mxf_write_primer_pack(s);
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
992 mxf_write_header_metadata_sets(s);
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
993 pos = url_ftell(s->pb);
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
994 // update header_byte_count
3843
b60ab685d415 remove header_byte_count_offset from context
bcoudurier
parents: 3842
diff changeset
995 url_fseek(pb, header_byte_count_offset, SEEK_SET);
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
996 put_be64(pb, pos - start);
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
997 url_fseek(pb, pos, SEEK_SET);
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
998 }
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
999
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1000 put_flush_packet(pb);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1001 }
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1002
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1003 static const UID mxf_mpeg2_codec_uls[] = {
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1004 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x10,0x00 }, // MP-ML I-Frame
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1005 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, // MP-ML Long GOP
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1006 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, // 422P-ML I-Frame
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1007 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, // 422P-ML Long GOP
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1008 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x02,0x00 }, // MP-HL I-Frame
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1009 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, // MP-HL Long GOP
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1010 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x02,0x00 }, // 422P-HL I-Frame
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1011 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, // 422P-HL Long GOP
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1012 };
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1013
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1014 static const UID *mxf_get_mpeg2_codec_ul(AVCodecContext *avctx)
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1015 {
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1016 if (avctx->profile == 4) { // Main
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1017 if (avctx->level == 8) // Main
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1018 return avctx->gop_size ?
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1019 &mxf_mpeg2_codec_uls[1] :
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1020 &mxf_mpeg2_codec_uls[0];
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1021 else if (avctx->level == 4) // High
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1022 return avctx->gop_size ?
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1023 &mxf_mpeg2_codec_uls[5] :
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1024 &mxf_mpeg2_codec_uls[4];
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1025 } else if (avctx->profile == 0) { // 422
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1026 if (avctx->level == 5) // Main
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1027 return avctx->gop_size ?
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1028 &mxf_mpeg2_codec_uls[3] :
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1029 &mxf_mpeg2_codec_uls[2];
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1030 else if (avctx->level == 2) // High
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1031 return avctx->gop_size ?
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1032 &mxf_mpeg2_codec_uls[7] :
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1033 &mxf_mpeg2_codec_uls[6];
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1034 }
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1035 return NULL;
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1036 }
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1037
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1038 static int mxf_parse_mpeg2_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1039 {
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1040 MXFContext *mxf = s->priv_data;
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1041 MXFStreamContext *sc = st->priv_data;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1042 uint32_t c = -1;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1043 int i;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1044
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1045 mxf->index_entries[mxf->edit_units_count].flags = 0;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1046
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1047 for(i = 0; i < pkt->size - 4; i++) {
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1048 c = (c<<8) + pkt->data[i];
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1049 if (c == 0x1B5) {
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1050 if (i + 2 < pkt->size && (pkt->data[i+1] & 0xf0) == 0x10) { // seq ext
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1051 st->codec->profile = pkt->data[i+1] & 0x07;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1052 st->codec->level = pkt->data[i+2] >> 4;
4314
dfa0afd806c5 parse mpeg2 progressive frame flag
bcoudurier
parents: 4313
diff changeset
1053 } else if (i + 5 < pkt->size && (pkt->data[i+1] & 0xf0) == 0x80) { // pict coding ext
dfa0afd806c5 parse mpeg2 progressive frame flag
bcoudurier
parents: 4313
diff changeset
1054 sc->interlaced = !(pkt->data[i+5] & 0x80); // progressive frame
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1055 break;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1056 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1057 } else if (c == 0x1b8) { // gop
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1058 if (i + 4 < pkt->size && pkt->data[i+4]>>6 & 0x01) // closed
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1059 mxf->index_entries[mxf->edit_units_count].flags |= 0x80; // random access
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1060 } else if (c == 0x1b3) { // seq
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1061 mxf->index_entries[mxf->edit_units_count].flags |= 0x40;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1062 } else if (c == 0x100) { // pic
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1063 int pict_type = (pkt->data[i+2]>>3) & 0x07;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1064 if (pict_type == 2) { // P frame
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1065 mxf->index_entries[mxf->edit_units_count].flags |= 0x22;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1066 st->codec->gop_size = 1;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1067 } else if (pict_type == 3) { // B frame
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1068 mxf->index_entries[mxf->edit_units_count].flags |= 0x33;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1069 sc->temporal_reordering = -1;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1070 } else if (!pict_type) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1071 av_log(s, AV_LOG_ERROR, "error parsing mpeg2 frame\n");
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1072 return 0;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1073 }
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1074 }
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1075 }
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1076 sc->codec_ul = mxf_get_mpeg2_codec_ul(st->codec);
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1077 return !!sc->codec_ul;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1078 }
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1079
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1080 static int ff_audio_interleave_init(AVFormatContext *s,
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1081 const int *samples_per_frame,
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1082 AVRational time_base)
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1083 {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1084 int i;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1085
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1086 if (!samples_per_frame)
4327
60bad0ded22a do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents: 4326
diff changeset
1087 return -1;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1088
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1089 for (i = 0; i < s->nb_streams; i++) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1090 AVStream *st = s->streams[i];
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1091 AudioInterleaveContext *aic = st->priv_data;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1092
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1093 if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1094 aic->sample_size = (st->codec->channels *
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1095 av_get_bits_per_sample(st->codec->codec_id)) / 8;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1096 if (!aic->sample_size) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1097 av_log(s, AV_LOG_ERROR, "could not compute sample size\n");
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1098 return -1;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1099 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1100 aic->samples_per_frame = samples_per_frame;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1101 aic->samples = aic->samples_per_frame;
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1102 aic->time_base = time_base;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1103
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1104 av_fifo_init(&aic->fifo, 100 * *aic->samples);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1105 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1106 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1107
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1108 return 0;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1109 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1110
4330
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1111 static void ff_audio_interleave_close(AVFormatContext *s)
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1112 {
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1113 int i;
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1114 for (i = 0; i < s->nb_streams; i++) {
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1115 AVStream *st = s->streams[i];
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1116 AudioInterleaveContext *aic = st->priv_data;
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1117
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1118 if (st->codec->codec_type == CODEC_TYPE_AUDIO)
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1119 av_fifo_free(&aic->fifo);
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1120 }
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1121 }
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1122
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1123 static uint64_t mxf_parse_timestamp(time_t timestamp)
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1124 {
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1125 struct tm *time = localtime(&timestamp);
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1126 return (uint64_t)(time->tm_year+1900) << 48 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1127 (uint64_t)(time->tm_mon+1) << 40 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1128 (uint64_t) time->tm_mday << 32 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1129 time->tm_hour << 24 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1130 time->tm_min << 16 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1131 time->tm_sec << 8;
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1132 }
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1133
3836
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1134 static int mxf_write_header(AVFormatContext *s)
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1135 {
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1136 MXFContext *mxf = s->priv_data;
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1137 int i;
4001
fcb9de59245f uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 3908
diff changeset
1138 uint8_t present[FF_ARRAY_ELEMS(mxf_essence_container_uls)] = {0};
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1139 const int *samples_per_frame = NULL;
3816
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1140
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1141 if (s->nb_streams > 17) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1142 av_log(s, AV_LOG_ERROR, "error, mxf muxer supports 17 tracks maximum\n");
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1143 return -1;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1144 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1145
3816
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1146 for (i = 0; i < s->nb_streams; i++) {
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1147 AVStream *st = s->streams[i];
3824
f1270349f49f replace sizeof(type) by sizeof *ptr
bcoudurier
parents: 3823
diff changeset
1148 MXFStreamContext *sc = av_mallocz(sizeof(*sc));
3816
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1149 if (!sc)
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1150 return AVERROR(ENOMEM);
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1151 st->priv_data = sc;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1152
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1153 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
4363
8142fb82cd75 be more flexible with frame rate check
bcoudurier
parents: 4351
diff changeset
1154 if (fabs(av_q2d(st->codec->time_base) - 1/25.0) < 0.0001) {
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1155 samples_per_frame = PAL_samples_per_frame;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1156 mxf->time_base = (AVRational){ 1, 25 };
4363
8142fb82cd75 be more flexible with frame rate check
bcoudurier
parents: 4351
diff changeset
1157 } else if (fabs(av_q2d(st->codec->time_base) - 1001/30000.0) < 0.0001) {
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1158 samples_per_frame = NTSC_samples_per_frame;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1159 mxf->time_base = (AVRational){ 1001, 30000 };
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1160 } else {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1161 av_log(s, AV_LOG_ERROR, "unsupported video frame rate\n");
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1162 return -1;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1163 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1164 mxf->edit_unit_start = st->index;
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1165 av_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den);
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1166 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1167 if (st->codec->sample_rate != 48000) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1168 av_log(s, AV_LOG_ERROR, "only 48khz is implemented\n");
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1169 return -1;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1170 }
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1171 av_set_pts_info(st, 64, 1, st->codec->sample_rate);
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1172 }
3834
d49f55ab650c set duration to distinguished value
bcoudurier
parents: 3833
diff changeset
1173 sc->duration = -1;
d49f55ab650c set duration to distinguished value
bcoudurier
parents: 3833
diff changeset
1174
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1175 sc->index = mxf_get_essence_container_ul_index(st->codec->codec_id);
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1176 if (sc->index == -1) {
3817
22831cc65a35 get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents: 3816
diff changeset
1177 av_log(s, AV_LOG_ERROR, "track %d: could not find essence container ul, "
22831cc65a35 get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents: 3816
diff changeset
1178 "codec not currently supported in container\n", i);
22831cc65a35 get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents: 3816
diff changeset
1179 return -1;
22831cc65a35 get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents: 3816
diff changeset
1180 }
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1181
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1182 sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1183
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1184 if (!present[sc->index]) {
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1185 mxf->essence_containers_indices[mxf->essence_container_count++] = sc->index;
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1186 present[sc->index] = 1;
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
1187 } else
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1188 present[sc->index]++;
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1189 memcpy(sc->track_essence_element_key, mxf_essence_container_uls[sc->index].element_ul, 15);
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1190 sc->track_essence_element_key[15] = present[sc->index];
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
1191 PRINT_KEY(s, "track essence element key", sc->track_essence_element_key);
3816
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1192 }
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1193
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1194 for (i = 0; i < s->nb_streams; i++) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1195 MXFStreamContext *sc = s->streams[i]->priv_data;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1196 // update element count
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1197 sc->track_essence_element_key[13] = present[sc->index];
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1198 sc->order = AV_RB32(sc->track_essence_element_key+12);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1199 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1200
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1201 mxf->timestamp = mxf_parse_timestamp(s->timestamp);
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1202
4327
60bad0ded22a do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents: 4326
diff changeset
1203 if (!samples_per_frame)
60bad0ded22a do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents: 4326
diff changeset
1204 samples_per_frame = PAL_samples_per_frame;
60bad0ded22a do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents: 4326
diff changeset
1205
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1206 if (ff_audio_interleave_init(s, samples_per_frame, mxf->time_base) < 0)
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1207 return -1;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1208
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1209 return 0;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1210 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1211
3836
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1212 static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
3778
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1213 {
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1214 MXFContext *mxf = s->priv_data;
3778
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1215 ByteIOContext *pb = s->pb;
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1216 AVStream *st = s->streams[pkt->stream_index];
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1217 MXFStreamContext *sc = st->priv_data;
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1218
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1219 if (!(mxf->edit_units_count % MXF_INDEX_CLUSTER_SIZE)) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1220 mxf->index_entries = av_realloc(mxf->index_entries,
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1221 (mxf->edit_units_count + MXF_INDEX_CLUSTER_SIZE)*
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1222 sizeof(*mxf->index_entries));
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1223 if (!mxf->index_entries) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1224 av_log(s, AV_LOG_ERROR, "could not allocate index entries\n");
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1225 return -1;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1226 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1227 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1228
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1229 if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1230 if (!mxf_parse_mpeg2_frame(s, st, pkt)) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1231 av_log(s, AV_LOG_ERROR, "could not get mpeg2 profile and level\n");
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1232 return -1;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1233 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1234 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1235
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1236 if (!mxf->header_written) {
4370
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1237 mxf_write_partition(s, 1, 0, 0, header_open_partition_key, 1);
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1238 mxf->header_written = 1;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1239 }
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1240
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1241 if (st->index == mxf->edit_unit_start) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1242 mxf->index_entries[mxf->edit_units_count].offset = url_ftell(pb);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1243 mxf->index_entries[mxf->edit_units_count].slice_offset[st->index] = 0;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1244 mxf->edit_units_count++;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1245 } else {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1246 mxf->index_entries[mxf->edit_units_count-1].slice_offset[st->index] =
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1247 url_ftell(pb) - mxf->index_entries[mxf->edit_units_count-1].offset;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1248 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1249
3778
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1250 put_buffer(pb, sc->track_essence_element_key, 16); // write key
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1251 klv_encode_ber_length(pb, pkt->size); // write length
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1252 put_buffer(pb, pkt->data, pkt->size); // write value
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1253
3835
b60bdaa5a202 correctly set track duration
bcoudurier
parents: 3834
diff changeset
1254 sc->duration = FFMAX(pkt->pts + pkt->duration, sc->duration);
b60bdaa5a202 correctly set track duration
bcoudurier
parents: 3834
diff changeset
1255
3778
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1256 put_flush_packet(pb);
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1257 return 0;
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1258 }
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1259
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1260 static void mxf_write_random_index_pack(AVFormatContext *s)
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1261 {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1262 MXFContext *mxf = s->priv_data;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1263 ByteIOContext *pb = s->pb;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1264 uint64_t pos = url_ftell(pb);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1265
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1266 put_buffer(pb, random_index_pack_key, 16);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1267 klv_encode_ber_length(pb, 28);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1268
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1269 put_be32(pb, 1); // BodySID of header partition
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1270 put_be64(pb, 0); // offset of header partition
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1271
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1272 put_be32(pb, 0); // BodySID of footer partition
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1273 put_be64(pb, mxf->footer_partition_offset);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1274
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1275 put_be32(pb, url_ftell(pb) - pos + 4);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1276 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1277
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1278 static int mxf_write_footer(AVFormatContext *s)
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1279 {
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1280 MXFContext *mxf = s->priv_data;
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1281 ByteIOContext *pb = s->pb;
4370
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1282 unsigned index_byte_count =
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1283 109 + s->nb_streams*6 +
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1284 mxf->edit_units_count*(11+(s->nb_streams-1)*4);
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1285
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1286 // add encoded ber length
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1287 index_byte_count += 16 +
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1288 (index_byte_count < 128 ? 1 : (av_log2(index_byte_count) >> 3) + 2);
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1289
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1290 mxf->footer_partition_offset = url_ftell(pb);
4370
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1291 mxf_write_partition(s, 0, 2, index_byte_count, footer_partition_key, 0);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1292
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1293 mxf_write_index_table_segment(s);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1294
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1295 mxf_write_random_index_pack(s);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1296
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1297 if (!url_is_streamed(s->pb)) {
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1298 url_fseek(pb, 0, SEEK_SET);
4370
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1299 mxf_write_partition(s, 1, 0, 0, header_closed_partition_key, 1);
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1300 }
4330
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1301
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1302 ff_audio_interleave_close(s);
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1303
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1304 mxf_free(s);
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1305 return 0;
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1306 }
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1307
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1308 static int mxf_interleave_new_audio_packet(AVFormatContext *s, AVPacket *pkt,
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1309 int stream_index, int flush)
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1310 {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1311 AVStream *st = s->streams[stream_index];
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1312 AudioInterleaveContext *aic = st->priv_data;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1313
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1314 int size = FFMIN(av_fifo_size(&aic->fifo), *aic->samples * aic->sample_size);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1315 if (!size || (!flush && size == av_fifo_size(&aic->fifo)))
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1316 return 0;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1317
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1318 av_new_packet(pkt, size);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1319 av_fifo_read(&aic->fifo, pkt->data, size);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1320
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1321 pkt->dts = pkt->pts = aic->dts;
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1322 pkt->duration = av_rescale_q(*aic->samples, st->time_base, aic->time_base);
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1323 pkt->stream_index = stream_index;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1324 aic->dts += pkt->duration;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1325
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1326 aic->samples++;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1327 if (!*aic->samples)
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1328 aic->samples = aic->samples_per_frame;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1329
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1330 return size;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1331 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1332
4328
fb0fde31327a change prototype of mxf_interleave_get_packet to make it compatible
bcoudurier
parents: 4327
diff changeset
1333 static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush)
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1334 {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1335 AVPacketList *pktl;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1336 int stream_count = 0;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1337 int streams[MAX_STREAMS];
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1338
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1339 memset(streams, 0, sizeof(streams));
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1340 pktl = s->packet_buffer;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1341 while (pktl) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1342 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%lld\n", pktl->pkt.stream_index, pktl->pkt.dts);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1343 if (!streams[pktl->pkt.stream_index])
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1344 stream_count++;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1345 streams[pktl->pkt.stream_index]++;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1346 pktl = pktl->next;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1347 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1348
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1349 if (stream_count && (s->nb_streams == stream_count || flush)) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1350 pktl = s->packet_buffer;
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1351 if (s->nb_streams != stream_count) {
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1352 MXFContext *mxf = s->priv_data;
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1353 AVPacketList *first = NULL;
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1354 // find first packet in edit unit
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1355 while (pktl) {
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1356 AVStream *st = s->streams[pktl->pkt.stream_index];
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1357 if (st->index == mxf->edit_unit_start)
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1358 break;
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1359 else if (!first)
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1360 first = pktl;
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1361 pktl = pktl->next;
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1362 }
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1363 // purge packet queue
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1364 while (pktl) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1365 AVPacketList *next = pktl->next;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1366 av_free_packet(&pktl->pkt);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1367 av_freep(&pktl);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1368 pktl = next;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1369 }
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1370 if (!first)
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1371 goto out;
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1372 pktl = first;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1373 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1374
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1375 *out = pktl->pkt;
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1376 //av_log(s, AV_LOG_DEBUG, "out st:%d dts:%lld\n", (*out).stream_index, (*out).dts);
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1377 s->packet_buffer = pktl->next;
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1378 av_freep(&pktl);
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1379 return 1;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1380 } else {
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1381 out:
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1382 av_init_packet(out);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1383 return 0;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1384 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1385 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1386
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1387 static int mxf_compare_timestamps(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1388 {
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1389 MXFStreamContext *sc = s->streams[pkt ->stream_index]->priv_data;
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1390 MXFStreamContext *sc2 = s->streams[next->stream_index]->priv_data;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1391
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1392 return next->dts > pkt->dts ||
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1393 (next->dts == pkt->dts && sc->order < sc2->order);
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1394 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1395
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1396 static int mxf_interleave(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush)
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1397 {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1398 int i;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1399
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1400 if (pkt) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1401 AVStream *st = s->streams[pkt->stream_index];
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1402 AudioInterleaveContext *aic = st->priv_data;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1403 if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1404 av_fifo_generic_write(&aic->fifo, pkt->data, pkt->size, NULL);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1405 } else {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1406 // rewrite pts and dts to be decoded time line position
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1407 pkt->pts = pkt->dts = aic->dts;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1408 aic->dts += pkt->duration;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1409 ff_interleave_add_packet(s, pkt, mxf_compare_timestamps);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1410 }
4328
fb0fde31327a change prototype of mxf_interleave_get_packet to make it compatible
bcoudurier
parents: 4327
diff changeset
1411 pkt = NULL;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1412 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1413
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1414 for (i = 0; i < s->nb_streams; i++) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1415 AVStream *st = s->streams[i];
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1416 if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1417 AVPacket new_pkt;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1418 while (mxf_interleave_new_audio_packet(s, &new_pkt, i, flush))
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1419 ff_interleave_add_packet(s, &new_pkt, mxf_compare_timestamps);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1420 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1421 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1422
4328
fb0fde31327a change prototype of mxf_interleave_get_packet to make it compatible
bcoudurier
parents: 4327
diff changeset
1423 return mxf_interleave_get_packet(s, out, pkt, flush);
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1424 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1425
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1426 AVOutputFormat mxf_muxer = {
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1427 "mxf",
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1428 NULL_IF_CONFIG_SMALL("Material eXchange Format"),
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1429 NULL,
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1430 "mxf",
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1431 sizeof(MXFContext),
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1432 CODEC_ID_PCM_S16LE,
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1433 CODEC_ID_MPEG2VIDEO,
3836
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1434 mxf_write_header,
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1435 mxf_write_packet,
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1436 mxf_write_footer,
4350
b7fdb211ba7b mxf does not have timestamps
bcoudurier
parents: 4346
diff changeset
1437 AVFMT_NOTIMESTAMPS,
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1438 NULL,
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1439 mxf_interleave,
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1440 };