annotate mxfenc.c @ 4417:de5ccc7a4461 libavformat

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