annotate mxfenc.c @ 6275:287072e5227b libavformat

Add MD5 protocol This is a write-only protocol which computes the md5sum of data written, and on close writes this to the designated output or stdout if none is specified. It can be used to test muxers without writing an actual file.
author mru
date Sun, 18 Jul 2010 20:19:08 +0000
parents 23e04fb7656e
children 43fe2984f310
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
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
38 #include "libavutil/random_seed.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
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
47 AVOutputFormat mxf_d10_muxer;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
48
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
49 #define EDIT_UNITS_PER_BODY 250
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
50 #define KAG_SIZE 512
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
51
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
52 typedef struct {
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
53 int local_tag;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
54 UID uid;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
55 } MXFLocalTagPair;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
56
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
57 typedef struct {
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
58 uint8_t flags;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
59 uint64_t offset;
4407
b6b31de76359 fix doxygen
bcoudurier
parents: 4404
diff changeset
60 unsigned slice_offset; ///< offset of audio slice
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
61 uint16_t temporal_ref;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
62 } MXFIndexEntry;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
63
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
64 typedef struct {
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
65 AudioInterleaveContext aic;
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
66 UID track_essence_element_key;
5081
56f6b1d56db9 cosmetics, change case and comments alignment
bcoudurier
parents: 5080
diff changeset
67 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
68 const UID *codec_ul;
5081
56f6b1d56db9 cosmetics, change case and comments alignment
bcoudurier
parents: 5080
diff changeset
69 int order; ///< interleaving order if dts are equal
56f6b1d56db9 cosmetics, change case and comments alignment
bcoudurier
parents: 5080
diff changeset
70 int interlaced; ///< wether picture is interlaced
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
71 int temporal_reordering;
4505
da04428a94db fetch display aspect ratio from mpeg-2 essence
bcoudurier
parents: 4504
diff changeset
72 AVRational aspect_ratio; ///< display aspect ratio
5080
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
73 int closed_gop; ///< gop is closed, used in mpeg-2 frame parsing
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
74 } MXFStreamContext;
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
75
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
76 typedef struct {
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
77 UID container_ul;
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
78 UID element_ul;
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
79 UID codec_ul;
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
80 void (*write_desc)();
3847
b104a66d828e cosmetics, Pair -> Entry
bcoudurier
parents: 3846
diff changeset
81 } MXFContainerEssenceEntry;
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
82
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
83 static const struct {
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
84 enum CodecID id;
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
85 int index;
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
86 } mxf_essence_mappings[] = {
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
87 { CODEC_ID_MPEG2VIDEO, 0 },
4346
0a142b4b841e 24bit pcm support
bcoudurier
parents: 4345
diff changeset
88 { CODEC_ID_PCM_S24LE, 1 },
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
89 { CODEC_ID_PCM_S16LE, 1 },
5359
16a2de6da57e Use CODEC_ID_NONE instead of 0 for enum CodecID.
cehoyos
parents: 5210
diff changeset
90 { CODEC_ID_NONE }
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
91 };
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
92
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
93 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
94 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
95 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
96 static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
97 static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st);
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
98
3847
b104a66d828e cosmetics, Pair -> Entry
bcoudurier
parents: 3846
diff changeset
99 static const MXFContainerEssenceEntry mxf_essence_container_uls[] = {
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
100 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 },
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
101 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
102 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 },
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
103 mxf_write_mpegvideo_desc },
4320
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
104 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 },
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
105 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x03,0x00 },
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
106 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
107 mxf_write_aes3_desc },
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
108 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 },
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
109 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x01,0x00 },
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
110 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
111 mxf_write_wav_desc },
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
112 // D-10 625/50 PAL 50mb/s
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
113 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
114 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
115 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
116 mxf_write_cdci_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
117 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
118 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
119 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
120 mxf_write_generic_sound_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
121 // D-10 525/60 NTSC 50mb/s
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
122 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
123 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
124 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
125 mxf_write_cdci_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
126 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
127 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
128 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
129 mxf_write_generic_sound_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
130 // D-10 625/50 PAL 40mb/s
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
131 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
132 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
133 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
134 mxf_write_cdci_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
135 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
136 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
137 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
138 mxf_write_generic_sound_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
139 // D-10 525/60 NTSC 40mb/s
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
140 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
141 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
142 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
143 mxf_write_cdci_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
144 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
145 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
146 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
147 mxf_write_generic_sound_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
148 // D-10 625/50 PAL 30mb/s
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
149 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
150 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
151 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
152 mxf_write_cdci_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
153 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
154 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
155 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
156 mxf_write_generic_sound_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
157 // D-10 525/60 NTSC 30mb/s
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
158 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
159 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
160 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
161 mxf_write_cdci_desc },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
162 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
163 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
164 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
165 mxf_write_generic_sound_desc },
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
166 { { 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
167 { 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
168 { 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
169 NULL },
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
170 };
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
171
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
172 typedef struct MXFContext {
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
173 int64_t footer_partition_offset;
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
174 int essence_container_count;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
175 AVRational time_base;
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
176 int header_written;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
177 MXFIndexEntry *index_entries;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
178 unsigned edit_units_count;
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
179 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
180 uint8_t slice_count; ///< index slice count minus 1 (1 if no audio, 0 otherwise)
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
181 int last_indexed_edit_unit;
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
182 uint64_t *body_partition_offset;
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
183 unsigned body_partitions_count;
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
184 int last_key_index; ///< index of last key frame
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
185 uint64_t duration;
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
186 AVStream *timecode_track;
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
187 int timecode_base; ///< rounded time code base (25 or 30)
4449
aaae79b414f3 parse mpeg2 gop header time code and use it
bcoudurier
parents: 4448
diff changeset
188 int timecode_start; ///< frame number computed from mpeg-2 gop header timecode
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
189 int timecode_drop_frame; ///< time code use drop frame method frop mpeg-2 essence gop header
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
190 int edit_unit_byte_count; ///< fixed edit unit byte count
4481
27fd3af46000 compute body offset and index entry offset correctly
bcoudurier
parents: 4478
diff changeset
191 uint64_t body_offset;
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
192 uint32_t instance_number;
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
193 uint8_t umid[16]; ///< unique material identifier
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
194 } MXFContext;
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
195
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
196 static const uint8_t uuid_base[] = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd };
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
197 static const uint8_t umid_ul[] = { 0x06,0x0A,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x01,0x0D,0x00,0x13 };
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
198
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
199 /**
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
200 * complete key for operation pattern, partitions, and primer pack
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
201 */
4536
b94bedbb59d7 always use multi track since timecode track is present
bcoudurier
parents: 4535
diff changeset
202 static const uint8_t op1a_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x01,0x09,0x00 };
4351
e9b7237e3f3d cosmetics: whitespaces, empty lines
bcoudurier
parents: 4350
diff changeset
203 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
204 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
205 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
206 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
207 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
208 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
209 static const uint8_t klv_fill_key[] = { 0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x03,0x01,0x02,0x10,0x01,0x00,0x00,0x00 };
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
210 static const uint8_t body_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x03,0x04,0x00 }; // ClosedComplete
3839
2b1b25134815 header partition is open incomplete for now
bcoudurier
parents: 3838
diff changeset
211
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
212 /**
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
213 * partial key for header metadata
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
214 */
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
215 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
216 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
217
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
218 /**
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
219 * 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
220 */
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
221 static const MXFLocalTagPair mxf_local_tag_batch[] = {
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
222 // preface set
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
223 { 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
224 { 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
225 { 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
226 { 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
227 { 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
228 { 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
229 { 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
230 { 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
231 // Identification
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
232 { 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
233 { 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
234 { 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
235 { 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
236 { 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
237 { 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
238 // Content Storage
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
239 { 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
240 { 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
241 // Essence Container Data
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
242 { 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
243 { 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
244 // Package
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
245 { 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
246 { 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
247 { 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
248 { 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
249 { 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
250 // Track
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
251 { 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
252 { 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
253 { 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
254 { 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
255 { 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
256 // Sequence
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
257 { 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
258 { 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
259 { 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
260 // Source Clip
4431
723d05287ae9 fix primer pack local tags uls
bcoudurier
parents: 4430
diff changeset
261 { 0x1201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,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
262 { 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
263 { 0x1102, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x02,0x00,0x00,0x00}}, /* SourceTrackID */
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
264 // Timecode Component
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
265 { 0x1501, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x05,0x00,0x00}}, /* Start Time Code */
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
266 { 0x1502, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x04,0x01,0x01,0x02,0x06,0x00,0x00}}, /* Rounded Time Code Base */
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
267 { 0x1503, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x04,0x01,0x01,0x05,0x00,0x00,0x00}}, /* Drop Frame */
3794
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
268 // File Descriptor
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
269 { 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
270 { 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
271 { 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
272 { 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
273 // Generic Picture Essence Descriptor
4321
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
274 { 0x320C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Frame Layout */
4431
723d05287ae9 fix primer pack local tags uls
bcoudurier
parents: 4430
diff changeset
275 { 0x320D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x03,0x02,0x05,0x00,0x00,0x00}}, /* Video Line Map */
3794
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
276 { 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
277 { 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
278 { 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
279 { 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
280 { 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
281 { 0x3201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x06,0x01,0x00,0x00,0x00,0x00}}, /* Picture Essence Coding */
4434
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
282 // CDCI Picture Essence Descriptor
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
283 { 0x3301, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x05,0x03,0x0A,0x00,0x00,0x00}}, /* Component Depth */
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
284 { 0x3302, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x05,0x00,0x00,0x00}}, /* Horizontal Subsampling */
3794
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
285 // Generic Sound Essence Descriptor
4431
723d05287ae9 fix primer pack local tags uls
bcoudurier
parents: 4430
diff changeset
286 { 0x3D02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Locked/Unlocked */
3794
137c5f8c36d5 cosmetics, typos, case
bcoudurier
parents: 3793
diff changeset
287 { 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
288 { 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
289 { 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
290 { 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
291 // Index Table Segment
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
292 { 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
293 { 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
294 { 0x3F0D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x02,0x01,0x01,0x02,0x00,0x00}}, /* Index Duration */
4431
723d05287ae9 fix primer pack local tags uls
bcoudurier
parents: 4430
diff changeset
295 { 0x3F05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x06,0x02,0x01,0x00,0x00,0x00,0x00}}, /* Edit Unit Byte Count */
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
296 { 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
297 { 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
298 { 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
299 { 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
300 // MPEG video Descriptor
87455a164f2b write bitrate tag
bcoudurier
parents: 4335
diff changeset
301 { 0x8000, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0B,0x00,0x00}}, /* BitRate */
5090
f2671cc3467c write profile and level local tag in mpeg descriptor
bcoudurier
parents: 5081
diff changeset
302 { 0x8007, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0A,0x00,0x00}}, /* ProfileAndLevel */
4339
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
303 // Wave Audio Essence Descriptor
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
304 { 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
305 { 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
306 };
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
307
3844
b597c00051a6 fix type in prototype
bcoudurier
parents: 3843
diff changeset
308 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
309 {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
310 put_buffer(pb, uuid_base, 12);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
311 put_be16(pb, type);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
312 put_be16(pb, value);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
313 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
314
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
315 static void mxf_write_umid(AVFormatContext *s, int type)
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
316 {
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
317 MXFContext *mxf = s->priv_data;
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
318 put_buffer(s->pb, umid_ul, 13);
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
319 put_be24(s->pb, mxf->instance_number);
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
320 put_buffer(s->pb, mxf->umid, 15);
4697
ca6a35b5c915 again 10l, typo, put_byte instead of put_buffer
bcoudurier
parents: 4696
diff changeset
321 put_byte(s->pb, type);
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
322 }
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
323
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
324 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
325 {
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
326 put_be32(pb, ref_count);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
327 put_be32(pb, 16);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
328 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
329
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
330 static int klv_ber_length(uint64_t len)
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
331 {
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
332 if (len < 128)
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
333 return 1;
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
334 else
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
335 return (av_log2(len) >> 3) + 2;
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
336 }
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
337
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
338 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
339 {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
340 // Determine the best BER size
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
341 int size;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
342 if (len < 128) {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
343 //short form
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
344 put_byte(pb, len);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
345 return 1;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
346 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
347
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
348 size = (av_log2(len) >> 3) + 1;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
349
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
350 // long form
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
351 put_byte(pb, 0x80 + size);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
352 while(size) {
4351
e9b7237e3f3d cosmetics: whitespaces, empty lines
bcoudurier
parents: 4350
diff changeset
353 size--;
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
354 put_byte(pb, len >> 8 * size & 0xff);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
355 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
356 return 0;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
357 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
358
4469
49cf858ac430 encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents: 4461
diff changeset
359 static void klv_encode_ber4_length(ByteIOContext *pb, int len)
49cf858ac430 encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents: 4461
diff changeset
360 {
49cf858ac430 encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents: 4461
diff changeset
361 put_byte(pb, 0x80 + 3);
49cf858ac430 encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents: 4461
diff changeset
362 put_be24(pb, len);
49cf858ac430 encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents: 4461
diff changeset
363 }
49cf858ac430 encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents: 4461
diff changeset
364
3818
ae0d01b63679 compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents: 3817
diff changeset
365 /*
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
366 * Get essence container ul index
3818
ae0d01b63679 compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents: 3817
diff changeset
367 */
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
368 static int mxf_get_essence_container_ul_index(enum CodecID id)
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
369 {
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
370 int i;
4345
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
371 for (i = 0; mxf_essence_mappings[i].id; i++)
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
372 if (mxf_essence_mappings[i].id == id)
8e3538adb529 more flexible mapping selection
bcoudurier
parents: 4344
diff changeset
373 return mxf_essence_mappings[i].index;
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
374 return -1;
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
375 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
376
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
377 static void mxf_write_primer_pack(AVFormatContext *s)
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
378 {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
379 ByteIOContext *pb = s->pb;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
380 int local_tag_number, i = 0;
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
381
4001
fcb9de59245f uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 3908
diff changeset
382 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
383
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
384 put_buffer(pb, primer_pack_key, 16);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
385 klv_encode_ber_length(pb, local_tag_number * 18 + 8);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
386
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
387 put_be32(pb, local_tag_number); // local_tag num
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
388 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
389
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
390 for (i = 0; i < local_tag_number; i++) {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
391 put_be16(pb, mxf_local_tag_batch[i].local_tag);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
392 put_buffer(pb, mxf_local_tag_batch[i].uid, 16);
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
393 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
394 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
395
3815
af8d6067206e rename variable
bcoudurier
parents: 3814
diff changeset
396 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
397 {
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
398 put_be16(pb, tag);
3815
af8d6067206e rename variable
bcoudurier
parents: 3814
diff changeset
399 put_be16(pb, size);
3735
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
400 }
75fd6b0b1356 Ok-ed parts from patch by zhentan feng.
michael
parents: 3721
diff changeset
401
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
402 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
403 {
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
404 put_buffer(pb, header_metadata_key, 13);
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
405 put_be24(pb, value);
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
406 }
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
407
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
408 static void mxf_free(AVFormatContext *s)
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
409 {
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
410 int i;
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
411
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
412 for (i = 0; i < s->nb_streams; i++) {
3823
42ed5e2f1b4b merge declaration and init
bcoudurier
parents: 3822
diff changeset
413 AVStream *st = s->streams[i];
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
414 av_freep(&st->priv_data);
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
415 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
416 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
417
4404
7cf3b77ad6ff reuse MXFCodecUL for data def and simplify
bcoudurier
parents: 4403
diff changeset
418 static const MXFCodecUL *mxf_get_data_definition_ul(int type)
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
419 {
4404
7cf3b77ad6ff reuse MXFCodecUL for data def and simplify
bcoudurier
parents: 4403
diff changeset
420 const MXFCodecUL *uls = ff_mxf_data_definition_uls;
7cf3b77ad6ff reuse MXFCodecUL for data def and simplify
bcoudurier
parents: 4403
diff changeset
421 while (uls->uid[0]) {
7cf3b77ad6ff reuse MXFCodecUL for data def and simplify
bcoudurier
parents: 4403
diff changeset
422 if (type == uls->id)
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
423 break;
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
424 uls++;
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
425 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
426 return uls;
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
427 }
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
428
3821
7a1f6dd123a9 simplify mxf_write_essence_container_refs
bcoudurier
parents: 3820
diff changeset
429 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
430 {
3818
ae0d01b63679 compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents: 3817
diff changeset
431 MXFContext *c = s->priv_data;
3780
261cd3e672e5 Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents: 3778
diff changeset
432 ByteIOContext *pb = s->pb;
3818
ae0d01b63679 compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents: 3817
diff changeset
433 int i;
3780
261cd3e672e5 Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents: 3778
diff changeset
434
3822
be33feb6984f reindent
bcoudurier
parents: 3821
diff changeset
435 mxf_write_refs_count(pb, c->essence_container_count);
be33feb6984f reindent
bcoudurier
parents: 3821
diff changeset
436 av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", c->essence_container_count);
be33feb6984f reindent
bcoudurier
parents: 3821
diff changeset
437 for (i = 0; i < c->essence_container_count; i++) {
4475
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
438 MXFStreamContext *sc = s->streams[i]->priv_data;
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
439 put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
3822
be33feb6984f reindent
bcoudurier
parents: 3821
diff changeset
440 }
3780
261cd3e672e5 Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents: 3778
diff changeset
441 }
261cd3e672e5 Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents: 3778
diff changeset
442
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
443 static void mxf_write_preface(AVFormatContext *s)
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
444 {
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
445 MXFContext *mxf = s->priv_data;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
446 ByteIOContext *pb = s->pb;
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 mxf_write_metadata_key(pb, 0x012f00);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
449 PRINT_KEY(s, "preface key", pb->buf_ptr - 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
450 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
451
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
452 // write preface set uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
453 mxf_write_local_tag(pb, 16, 0x3C0A);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
454 mxf_write_uuid(pb, Preface, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
455 PRINT_KEY(s, "preface uid", pb->buf_ptr - 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
456
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
457 // last modified date
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
458 mxf_write_local_tag(pb, 8, 0x3B02);
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
459 put_be64(pb, mxf->timestamp);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
460
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
461 // write version
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
462 mxf_write_local_tag(pb, 2, 0x3B05);
4535
be04cfe425ed fix preface version
bcoudurier
parents: 4533
diff changeset
463 put_be16(pb, 258); // v1.2
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
464
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
465 // write identification_refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
466 mxf_write_local_tag(pb, 16 + 8, 0x3B06);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
467 mxf_write_refs_count(pb, 1);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
468 mxf_write_uuid(pb, Identification, 0);
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 // write content_storage_refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
471 mxf_write_local_tag(pb, 16, 0x3B03);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
472 mxf_write_uuid(pb, ContentStorage, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
473
4430
d6fe53c5c8d2 correctly set multi track operational pattern
bcoudurier
parents: 4426
diff changeset
474 // operational pattern
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
475 mxf_write_local_tag(pb, 16, 0x3B09);
4536
b94bedbb59d7 always use multi track since timecode track is present
bcoudurier
parents: 4535
diff changeset
476 put_buffer(pb, op1a_ul, 16);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
477
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
478 // write essence_container_refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
479 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
480 mxf_write_essence_container_refs(s);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
481
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
482 // write dm_scheme_refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
483 mxf_write_local_tag(pb, 8, 0x3B0B);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
484 put_be64(pb, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
485 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
486
3804
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
487 /*
3806
fa043e93fc66 introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents: 3805
diff changeset
488 * Write a local tag containing an ascii string as utf-16
3804
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
489 */
3806
fa043e93fc66 introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents: 3805
diff changeset
490 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
491 {
3805
d8a6432c76f3 use strlen and do not write useless trailing 0 according to specs
bcoudurier
parents: 3804
diff changeset
492 int i, size = strlen(value);
3806
fa043e93fc66 introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents: 3805
diff changeset
493 mxf_write_local_tag(pb, size*2, tag);
3804
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
494 for (i = 0; i < size; i++)
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
495 put_be16(pb, value[i]);
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
496 }
9a7f26d3b75c write strings as utf16be
bcoudurier
parents: 3794
diff changeset
497
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
498 static void mxf_write_identification(AVFormatContext *s)
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
499 {
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
500 MXFContext *mxf = s->priv_data;
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
501 ByteIOContext *pb = s->pb;
3810
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
502 const char *company = "FFmpeg";
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
503 const char *product = "OP1a Muxer";
3807
24113c3ebeaf always write required version string local tag
bcoudurier
parents: 3806
diff changeset
504 const char *version;
3810
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
505 int length;
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
506
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
507 mxf_write_metadata_key(pb, 0x013000);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
508 PRINT_KEY(s, "identification key", pb->buf_ptr - 16);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
509
3808
dd88c58a4432 simplify
bcoudurier
parents: 3807
diff changeset
510 version = s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT ?
3809
22b984b6cec1 only put version in tag
bcoudurier
parents: 3808
diff changeset
511 "0.0.0" : AV_STRINGIFY(LIBAVFORMAT_VERSION);
3810
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
512 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
513 klv_encode_ber_length(pb, length);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
514
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
515 // write uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
516 mxf_write_local_tag(pb, 16, 0x3C0A);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
517 mxf_write_uuid(pb, Identification, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
518 PRINT_KEY(s, "identification uid", pb->buf_ptr - 16);
3811
0daa9773c9c3 cosmetics
bcoudurier
parents: 3810
diff changeset
519
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
520 // write generation uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
521 mxf_write_local_tag(pb, 16, 0x3C09);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
522 mxf_write_uuid(pb, Identification, 1);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
523
3810
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
524 mxf_write_local_tag_utf16(pb, 0x3C01, company); // Company Name
297ad1d4d4d6 simplify, and factorize
bcoudurier
parents: 3809
diff changeset
525 mxf_write_local_tag_utf16(pb, 0x3C02, product); // Product Name
3807
24113c3ebeaf always write required version string local tag
bcoudurier
parents: 3806
diff changeset
526 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
527
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
528 // write product uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
529 mxf_write_local_tag(pb, 16, 0x3C05);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
530 mxf_write_uuid(pb, Identification, 2);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
531
4384
bfb10be2b631 use timestamp as modification date
bcoudurier
parents: 4382
diff changeset
532 // modification date
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
533 mxf_write_local_tag(pb, 8, 0x3C06);
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
534 put_be64(pb, mxf->timestamp);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
535 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
536
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
537 static void mxf_write_content_storage(AVFormatContext *s)
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
538 {
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
539 ByteIOContext *pb = s->pb;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
540
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
541 mxf_write_metadata_key(pb, 0x011800);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
542 PRINT_KEY(s, "content storage key", pb->buf_ptr - 16);
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
543 klv_encode_ber_length(pb, 92);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
544
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
545 // write uid
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
546 mxf_write_local_tag(pb, 16, 0x3C0A);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
547 mxf_write_uuid(pb, ContentStorage, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
548 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
549
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
550 // write package reference
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
551 mxf_write_local_tag(pb, 16 * 2 + 8, 0x1901);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
552 mxf_write_refs_count(pb, 2);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
553 mxf_write_uuid(pb, MaterialPackage, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
554 mxf_write_uuid(pb, SourcePackage, 0);
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
555
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
556 // write essence container data
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
557 mxf_write_local_tag(pb, 8 + 16, 0x1902);
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
558 mxf_write_refs_count(pb, 1);
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
559 mxf_write_uuid(pb, EssenceContainerData, 0);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
560 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
561
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
562 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
563 {
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
564 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
565 ByteIOContext *pb = s->pb;
3823
42ed5e2f1b4b merge declaration and init
bcoudurier
parents: 3822
diff changeset
566 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
567
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
568 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
569 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
570 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
571
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
572 // write track uid
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, 16, 0x3C0A);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
574 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
575 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
576
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
577 // write track id
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
578 mxf_write_local_tag(pb, 4, 0x4801);
4565
168e8eafefc6 start track id at 2, track id 1 for timecode
bcoudurier
parents: 4537
diff changeset
579 put_be32(pb, st->index+2);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
580
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
581 // write track number
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
582 mxf_write_local_tag(pb, 4, 0x4804);
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
583 if (type == MaterialPackage)
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
584 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
585 else
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
586 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
587
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
588 mxf_write_local_tag(pb, 8, 0x4B01);
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
589 put_be32(pb, mxf->time_base.den);
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
590 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
591
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
592 // write origin
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
593 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
594 put_be64(pb, 0);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
595
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
596 // write sequence refs
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
597 mxf_write_local_tag(pb, 16, 0x4803);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
598 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
599 }
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
600
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
601 static const uint8_t smpte_12m_timecode_track_data_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x01,0x01,0x00,0x00,0x00 };
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
602
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
603 static void mxf_write_common_fields(AVFormatContext *s, AVStream *st)
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
604 {
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
605 MXFContext *mxf = s->priv_data;
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
606 ByteIOContext *pb = s->pb;
3834
d49f55ab650c set duration to distinguished value
bcoudurier
parents: 3833
diff changeset
607
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
608 // find data define uls
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
609 mxf_write_local_tag(pb, 16, 0x0201);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
610 if (st == mxf->timecode_track)
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
611 put_buffer(pb, smpte_12m_timecode_track_data_ul, 16);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
612 else {
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
613 const MXFCodecUL *data_def_ul = mxf_get_data_definition_ul(st->codec->codec_type);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
614 put_buffer(pb, data_def_ul->uid, 16);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
615 }
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
616
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
617 // write duration
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
618 mxf_write_local_tag(pb, 8, 0x0202);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
619 put_be64(pb, mxf->duration);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
620 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
621
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
622 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
623 {
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
624 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
625 ByteIOContext *pb = s->pb;
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
626 enum MXFMetadataSetType component;
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
627
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
628 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
629 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
630 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
631
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
632 mxf_write_local_tag(pb, 16, 0x3C0A);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
633 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
634
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
635 PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
636 mxf_write_common_fields(s, st);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
637
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
638 // write structural component
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
639 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
640 mxf_write_refs_count(pb, 1);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
641 if (st == mxf->timecode_track)
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
642 component = TimecodeComponent;
4529
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
643 else
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
644 component = SourceClip;
4529
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
645 if (type == SourcePackage)
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
646 component += TypeBottom;
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
647 mxf_write_uuid(pb, component, st->index);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
648 }
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
649
4529
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
650 static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
651 {
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
652 MXFContext *mxf = s->priv_data;
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
653 ByteIOContext *pb = s->pb;
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
654
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
655 mxf_write_metadata_key(pb, 0x011400);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
656 klv_encode_ber_length(pb, 75);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
657
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
658 // UID
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
659 mxf_write_local_tag(pb, 16, 0x3C0A);
4529
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
660 mxf_write_uuid(pb, type == MaterialPackage ? TimecodeComponent :
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
661 TimecodeComponent + TypeBottom, st->index);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
662
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
663 mxf_write_common_fields(s, st);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
664
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
665 // Start Time Code
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
666 mxf_write_local_tag(pb, 8, 0x1501);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
667 put_be64(pb, mxf->timecode_start);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
668
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
669 // Rounded Time Code Base
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
670 mxf_write_local_tag(pb, 2, 0x1502);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
671 put_be16(pb, mxf->timecode_base);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
672
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
673 // Drop Frame
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
674 mxf_write_local_tag(pb, 1, 0x1503);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
675 put_byte(pb, mxf->timecode_drop_frame);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
676 }
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
677
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
678 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
679 {
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
680 ByteIOContext *pb = s->pb;
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
681 int i;
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
682
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
683 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
684 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
685 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
686
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
687 // write uid
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
688 mxf_write_local_tag(pb, 16, 0x3C0A);
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
689 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
690
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
691 PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
692 mxf_write_common_fields(s, st);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
693
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
694 // write start_position
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
695 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
696 put_be64(pb, 0);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
697
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
698 // 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
699 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
700 if (type == SourcePackage) {
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
701 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
702 put_be64(pb, 0);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
703 } else
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
704 mxf_write_umid(s, 1);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
705
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
706 // write source track id
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
707 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
708 if (type == SourcePackage)
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
709 put_be32(pb, 0);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
710 else
4565
168e8eafefc6 start track id at 2, track id 1 for timecode
bcoudurier
parents: 4537
diff changeset
711 put_be32(pb, st->index+2);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
712 }
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
713
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
714 static void mxf_write_multi_descriptor(AVFormatContext *s)
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
715 {
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
716 MXFContext *mxf = s->priv_data;
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
717 ByteIOContext *pb = s->pb;
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
718 const uint8_t *ul;
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
719 int i;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
720
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
721 mxf_write_metadata_key(pb, 0x014400);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
722 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
723 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
724
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
725 mxf_write_local_tag(pb, 16, 0x3C0A);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
726 mxf_write_uuid(pb, MultipleDescriptor, 0);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
727 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
728
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
729 // write sample rate
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
730 mxf_write_local_tag(pb, 8, 0x3001);
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
731 put_be32(pb, mxf->time_base.den);
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
732 put_be32(pb, mxf->time_base.num);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
733
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
734 // write essence container ul
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
735 mxf_write_local_tag(pb, 16, 0x3004);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
736 if (mxf->essence_container_count > 1)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
737 ul = multiple_desc_ul;
4475
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
738 else {
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
739 MXFStreamContext *sc = s->streams[0]->priv_data;
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
740 ul = mxf_essence_container_uls[sc->index].container_ul;
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
741 }
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
742 put_buffer(pb, ul, 16);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
743
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
744 // write sub descriptor refs
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
745 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
746 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
747 for (i = 0; i < s->nb_streams; i++)
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
748 mxf_write_uuid(pb, SubDescriptor, i);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
749 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
750
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
751 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
752 {
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
753 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
754 MXFStreamContext *sc = st->priv_data;
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
755 ByteIOContext *pb = s->pb;
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
756
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
757 put_buffer(pb, key, 16);
5091
d1609b5528e6 use ber4 length for descriptors preferred by specs
bcoudurier
parents: 5090
diff changeset
758 klv_encode_ber4_length(pb, size+20+8+12+20);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
759
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
760 mxf_write_local_tag(pb, 16, 0x3C0A);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
761 mxf_write_uuid(pb, SubDescriptor, st->index);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
762
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
763 mxf_write_local_tag(pb, 4, 0x3006);
4565
168e8eafefc6 start track id at 2, track id 1 for timecode
bcoudurier
parents: 4537
diff changeset
764 put_be32(pb, st->index+2);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
765
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
766 mxf_write_local_tag(pb, 8, 0x3001);
4376
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
767 put_be32(pb, mxf->time_base.den);
2b46680bf82f always write mxf time base in descriptors
bcoudurier
parents: 4374
diff changeset
768 put_be32(pb, mxf->time_base.num);
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
769
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
770 mxf_write_local_tag(pb, 16, 0x3004);
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
771 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
772 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
773
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
774 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
775 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
776 static const UID mxf_aes3_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 };
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
777 static const UID mxf_cdci_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x28,0x00 };
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
778 static const UID mxf_generic_sound_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x42,0x00 };
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
779
4471
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
780 static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
781 {
4316
3c4392f087dc stored height is stupidly /2 if interlaced
bcoudurier
parents: 4315
diff changeset
782 MXFStreamContext *sc = st->priv_data;
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
783 ByteIOContext *pb = s->pb;
4277
a5e558f1a64f stored height is a multiple of 16 for mpeg2
bcoudurier
parents: 4012
diff changeset
784 int stored_height = (st->codec->height+15)/16*16;
4472
3ef8f4df0a54 store display height without vbi
bcoudurier
parents: 4471
diff changeset
785 int display_height;
4322
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
786 int f1, f2;
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
787
4527
3aa54e7973d7 simplify descriptor size computation logic
bcoudurier
parents: 4505
diff changeset
788 mxf_write_generic_desc(s, st, key, size+8+8+8+8+8+8+5+16+sc->interlaced*4+12+20);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
789
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
790 mxf_write_local_tag(pb, 4, 0x3203);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
791 put_be32(pb, st->codec->width);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
792
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
793 mxf_write_local_tag(pb, 4, 0x3202);
4316
3c4392f087dc stored height is stupidly /2 if interlaced
bcoudurier
parents: 4315
diff changeset
794 put_be32(pb, stored_height>>sc->interlaced);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
795
4335
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
796 mxf_write_local_tag(pb, 4, 0x3209);
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
797 put_be32(pb, st->codec->width);
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
798
4472
3ef8f4df0a54 store display height without vbi
bcoudurier
parents: 4471
diff changeset
799 if (st->codec->height == 608) // PAL + VBI
3ef8f4df0a54 store display height without vbi
bcoudurier
parents: 4471
diff changeset
800 display_height = 576;
3ef8f4df0a54 store display height without vbi
bcoudurier
parents: 4471
diff changeset
801 else if (st->codec->height == 512) // NTSC + VBI
3ef8f4df0a54 store display height without vbi
bcoudurier
parents: 4471
diff changeset
802 display_height = 486;
3ef8f4df0a54 store display height without vbi
bcoudurier
parents: 4471
diff changeset
803 else
3ef8f4df0a54 store display height without vbi
bcoudurier
parents: 4471
diff changeset
804 display_height = st->codec->height;
3ef8f4df0a54 store display height without vbi
bcoudurier
parents: 4471
diff changeset
805
4335
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
806 mxf_write_local_tag(pb, 4, 0x3208);
4472
3ef8f4df0a54 store display height without vbi
bcoudurier
parents: 4471
diff changeset
807 put_be32(pb, display_height>>sc->interlaced);
4335
e6fb8644af02 write display height/width tags
bcoudurier
parents: 4330
diff changeset
808
4434
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
809 // component depth
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
810 mxf_write_local_tag(pb, 4, 0x3301);
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
811 put_be32(pb, 8);
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
812
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
813 // horizontal subsampling
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
814 mxf_write_local_tag(pb, 4, 0x3302);
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
815 put_be32(pb, 2);
a75d42745d16 write component depth and horizontal subsampling best effort local tags
bcoudurier
parents: 4433
diff changeset
816
4321
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
817 // frame layout
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
818 mxf_write_local_tag(pb, 1, 0x320C);
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
819 put_byte(pb, sc->interlaced);
68de70aa392b add frame layout local tag, best effort
bcoudurier
parents: 4320
diff changeset
820
4322
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
821 // video line map
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
822 switch (st->codec->height) {
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
823 case 576: f1 = 23; f2 = 336; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
824 case 608: f1 = 7; f2 = 320; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
825 case 480: f1 = 20; f2 = 283; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
826 case 512: f1 = 7; f2 = 270; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
827 case 720: f1 = 26; f2 = 0; break; // progressive
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
828 case 1080: f1 = 21; f2 = 584; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
829 default: f1 = 0; f2 = 0; break;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
830 }
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
831
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
832 if (!sc->interlaced) {
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
833 f2 = 0;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
834 f1 *= 2;
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
835 }
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
836
4343
b691846ea95e fix video line map tag size
bcoudurier
parents: 4342
diff changeset
837 mxf_write_local_tag(pb, 12+sc->interlaced*4, 0x320D);
4337
3d3c7fbfd910 do not write f2 if not interlaced
bcoudurier
parents: 4336
diff changeset
838 put_be32(pb, sc->interlaced ? 2 : 1);
3d3c7fbfd910 do not write f2 if not interlaced
bcoudurier
parents: 4336
diff changeset
839 put_be32(pb, 4);
4322
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
840 put_be32(pb, f1);
4337
3d3c7fbfd910 do not write f2 if not interlaced
bcoudurier
parents: 4336
diff changeset
841 if (sc->interlaced)
3d3c7fbfd910 do not write f2 if not interlaced
bcoudurier
parents: 4336
diff changeset
842 put_be32(pb, f2);
4322
0d40ba62d7d7 write best effort video line map
bcoudurier
parents: 4321
diff changeset
843
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
844 mxf_write_local_tag(pb, 8, 0x320E);
4505
da04428a94db fetch display aspect ratio from mpeg-2 essence
bcoudurier
parents: 4504
diff changeset
845 put_be32(pb, sc->aspect_ratio.num);
da04428a94db fetch display aspect ratio from mpeg-2 essence
bcoudurier
parents: 4504
diff changeset
846 put_be32(pb, sc->aspect_ratio.den);
4317
b978795a9e37 local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents: 4316
diff changeset
847
b978795a9e37 local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents: 4316
diff changeset
848 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
849 put_buffer(pb, *sc->codec_ul, 16);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
850 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
851
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
852 static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
853 {
4527
3aa54e7973d7 simplify descriptor size computation logic
bcoudurier
parents: 4505
diff changeset
854 mxf_write_cdci_common(s, st, mxf_cdci_descriptor_key, 0);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
855 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
856
4471
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
857 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
858 {
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
859 ByteIOContext *pb = s->pb;
5090
f2671cc3467c write profile and level local tag in mpeg descriptor
bcoudurier
parents: 5081
diff changeset
860 int profile_and_level = (st->codec->profile<<4) | st->codec->level;
4471
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
861
5090
f2671cc3467c write profile and level local tag in mpeg descriptor
bcoudurier
parents: 5081
diff changeset
862 mxf_write_cdci_common(s, st, mxf_mpegvideo_descriptor_key, 8+5);
4471
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
863
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
864 // bit rate
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
865 mxf_write_local_tag(pb, 4, 0x8000);
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
866 put_be32(pb, st->codec->bit_rate);
5090
f2671cc3467c write profile and level local tag in mpeg descriptor
bcoudurier
parents: 5081
diff changeset
867
f2671cc3467c write profile and level local tag in mpeg descriptor
bcoudurier
parents: 5081
diff changeset
868 // profile and level
f2671cc3467c write profile and level local tag in mpeg descriptor
bcoudurier
parents: 5081
diff changeset
869 mxf_write_local_tag(pb, 1, 0x8007);
f2671cc3467c write profile and level local tag in mpeg descriptor
bcoudurier
parents: 5081
diff changeset
870 if (!st->codec->profile)
f2671cc3467c write profile and level local tag in mpeg descriptor
bcoudurier
parents: 5081
diff changeset
871 profile_and_level |= 0x80; // escape bit
f2671cc3467c write profile and level local tag in mpeg descriptor
bcoudurier
parents: 5081
diff changeset
872 put_byte(pb, profile_and_level);
4471
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
873 }
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
874
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
875 static void mxf_write_generic_sound_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
876 {
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
877 ByteIOContext *pb = s->pb;
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
878
4527
3aa54e7973d7 simplify descriptor size computation logic
bcoudurier
parents: 4505
diff changeset
879 mxf_write_generic_desc(s, st, key, size+5+12+8+8);
4318
a7d69a322311 thanks to interleaving, audio is now locked
bcoudurier
parents: 4317
diff changeset
880
4319
28d38c1fb5fa split wav_desc in generic_sound_desc
bcoudurier
parents: 4318
diff changeset
881 // audio locked
4318
a7d69a322311 thanks to interleaving, audio is now locked
bcoudurier
parents: 4317
diff changeset
882 mxf_write_local_tag(pb, 1, 0x3D02);
a7d69a322311 thanks to interleaving, audio is now locked
bcoudurier
parents: 4317
diff changeset
883 put_byte(pb, 1);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
884
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
885 // write audio sampling rate
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
886 mxf_write_local_tag(pb, 8, 0x3D03);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
887 put_be32(pb, st->codec->sample_rate);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
888 put_be32(pb, 1);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
889
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
890 mxf_write_local_tag(pb, 4, 0x3D07);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
891 put_be32(pb, st->codec->channels);
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
892
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
893 mxf_write_local_tag(pb, 4, 0x3D01);
4346
0a142b4b841e 24bit pcm support
bcoudurier
parents: 4345
diff changeset
894 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
895 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
896
4471
bac4bfb54ff7 split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents: 4470
diff changeset
897 static void mxf_write_wav_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
4319
28d38c1fb5fa split wav_desc in generic_sound_desc
bcoudurier
parents: 4318
diff changeset
898 {
4339
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
899 ByteIOContext *pb = s->pb;
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
900
4527
3aa54e7973d7 simplify descriptor size computation logic
bcoudurier
parents: 4505
diff changeset
901 mxf_write_generic_sound_common(s, st, key, size+6+8);
4339
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
902
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
903 mxf_write_local_tag(pb, 2, 0x3D0A);
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
904 put_be16(pb, st->codec->block_align);
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
905
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
906 // avg bytes per sec
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
907 mxf_write_local_tag(pb, 4, 0x3D09);
eaecbe63bcc5 write req local tags for wav
bcoudurier
parents: 4338
diff changeset
908 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
909 }
28d38c1fb5fa split wav_desc in generic_sound_desc
bcoudurier
parents: 4318
diff changeset
910
4340
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
911 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st)
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
912 {
4527
3aa54e7973d7 simplify descriptor size computation logic
bcoudurier
parents: 4505
diff changeset
913 mxf_write_wav_common(s, st, mxf_wav_descriptor_key, 0);
4340
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
914 }
ee0bdf4a43b0 factorize common wav local tags
bcoudurier
parents: 4339
diff changeset
915
4320
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
916 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
917 {
4527
3aa54e7973d7 simplify descriptor size computation logic
bcoudurier
parents: 4505
diff changeset
918 mxf_write_wav_common(s, st, mxf_aes3_descriptor_key, 0);
4320
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
919 }
3524125567f3 add aes3 pcm wrapping and use it by default
bcoudurier
parents: 4319
diff changeset
920
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
921 static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
922 {
4527
3aa54e7973d7 simplify descriptor size computation logic
bcoudurier
parents: 4505
diff changeset
923 mxf_write_generic_sound_common(s, st, mxf_generic_sound_descriptor_key, 0);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
924 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
925
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
926 static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
927 {
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
928 MXFContext *mxf = s->priv_data;
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
929 ByteIOContext *pb = s->pb;
4529
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
930 int i, track_count = s->nb_streams+1;
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
931
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
932 if (type == MaterialPackage) {
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
933 mxf_write_metadata_key(pb, 0x013600);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
934 PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
935 klv_encode_ber_length(pb, 92 + 16*track_count);
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
936 } else {
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
937 mxf_write_metadata_key(pb, 0x013700);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
938 PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
939 klv_encode_ber_length(pb, 112 + 16*track_count); // 20 bytes length for descriptor reference
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
940 }
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
941
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
942 // write uid
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
943 mxf_write_local_tag(pb, 16, 0x3C0A);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
944 mxf_write_uuid(pb, type, 0);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
945 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
946 PRINT_KEY(s, "package uid", pb->buf_ptr - 16);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
947
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
948 // write package umid
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
949 mxf_write_local_tag(pb, 32, 0x4401);
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
950 mxf_write_umid(s, type == SourcePackage);
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
951 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
952
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
953 // package creation date
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
954 mxf_write_local_tag(pb, 8, 0x4405);
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
955 put_be64(pb, mxf->timestamp);
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
956
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
957 // package modified date
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
958 mxf_write_local_tag(pb, 8, 0x4404);
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
959 put_be64(pb, mxf->timestamp);
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
960
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
961 // write track refs
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
962 mxf_write_local_tag(pb, track_count*16 + 8, 0x4403);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
963 mxf_write_refs_count(pb, track_count);
4529
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
964 mxf_write_uuid(pb, type == MaterialPackage ? Track :
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
965 Track + TypeBottom, -1); // timecode track
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
966 for (i = 0; i < s->nb_streams; i++)
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
967 mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i);
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
968
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
969 // write multiple descriptor reference
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
970 if (type == SourcePackage) {
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
971 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
972 if (s->nb_streams > 1) {
9b3ad7f292a4 do no write multi descriptor when only one track is present
bcoudurier
parents: 3850
diff changeset
973 mxf_write_uuid(pb, MultipleDescriptor, 0);
9b3ad7f292a4 do no write multi descriptor when only one track is present
bcoudurier
parents: 3850
diff changeset
974 mxf_write_multi_descriptor(s);
9b3ad7f292a4 do no write multi descriptor when only one track is present
bcoudurier
parents: 3850
diff changeset
975 } else
9b3ad7f292a4 do no write multi descriptor when only one track is present
bcoudurier
parents: 3850
diff changeset
976 mxf_write_uuid(pb, SubDescriptor, 0);
3848
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
977 }
1b5106f2b3f4 move mxf_write_package to permit function merge
bcoudurier
parents: 3847
diff changeset
978
4529
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
979 // write timecode track
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
980 mxf_write_track(s, mxf->timecode_track, type);
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
981 mxf_write_sequence(s, mxf->timecode_track, type);
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
982 mxf_write_timecode_component(s, mxf->timecode_track, type);
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
983
3831
547e11f5924b cosmetics, whitespace
bcoudurier
parents: 3830
diff changeset
984 for (i = 0; i < s->nb_streams; i++) {
3832
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
985 AVStream *st = s->streams[i];
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
986 mxf_write_track(s, st, type);
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
987 mxf_write_sequence(s, st, type);
f3a099c0fdf8 simplify, pass AVStream directly instead of index
bcoudurier
parents: 3831
diff changeset
988 mxf_write_structural_component(s, st, type);
3743
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
989
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
990 if (type == SourcePackage) {
3845
c266530d56b4 merge descriptor write table with essence container uls table and simplify
bcoudurier
parents: 3844
diff changeset
991 MXFStreamContext *sc = st->priv_data;
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
992 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
993 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
994 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
995 }
68414dc4c4d1 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3740
diff changeset
996
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
997 static int mxf_write_essence_container_data(AVFormatContext *s)
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
998 {
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
999 ByteIOContext *pb = s->pb;
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1000
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1001 mxf_write_metadata_key(pb, 0x012300);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1002 klv_encode_ber_length(pb, 72);
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1003
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1004 mxf_write_local_tag(pb, 16, 0x3C0A); // Instance UID
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1005 mxf_write_uuid(pb, EssenceContainerData, 0);
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1006
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1007 mxf_write_local_tag(pb, 32, 0x2701); // Linked Package UID
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1008 mxf_write_umid(s, 1);
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1009
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1010 mxf_write_local_tag(pb, 4, 0x3F07); // BodySID
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1011 put_be32(pb, 1);
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1012
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1013 mxf_write_local_tag(pb, 4, 0x3F06); // IndexSID
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1014 put_be32(pb, 2);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1015
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1016 return 0;
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1017 }
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1018
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1019 static int mxf_write_header_metadata_sets(AVFormatContext *s)
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1020 {
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1021 mxf_write_preface(s);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1022 mxf_write_identification(s);
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1023 mxf_write_content_storage(s);
3849
9dabc8338517 remove mxf_build_structural_metadata, simplify
bcoudurier
parents: 3848
diff changeset
1024 mxf_write_package(s, MaterialPackage);
9dabc8338517 remove mxf_build_structural_metadata, simplify
bcoudurier
parents: 3848
diff changeset
1025 mxf_write_package(s, SourcePackage);
4279
2402eb8c37ff write essence container data
bcoudurier
parents: 4278
diff changeset
1026 mxf_write_essence_container_data(s);
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1027 return 0;
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1028 }
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1029
4397
6d1626886974 only use 2 slices for index, one video(vbr) and one audio(cbr)
bcoudurier
parents: 4396
diff changeset
1030 static unsigned klv_fill_size(uint64_t size)
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1031 {
4397
6d1626886974 only use 2 slices for index, one video(vbr) and one audio(cbr)
bcoudurier
parents: 4396
diff changeset
1032 unsigned pad = KAG_SIZE - (size & (KAG_SIZE-1));
4469
49cf858ac430 encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents: 4461
diff changeset
1033 if (pad < 20) // smallest fill item possible
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1034 return pad + KAG_SIZE;
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1035 else
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1036 return pad & (KAG_SIZE-1);
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1037 }
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1038
4408
94287f131b60 remove useless return
bcoudurier
parents: 4407
diff changeset
1039 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
1040 {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1041 MXFContext *mxf = s->priv_data;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1042 ByteIOContext *pb = s->pb;
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1043 int i, j, temporal_reordering = 0;
4446
efe78f986bec fix last keyframe index accross body partitions
bcoudurier
parents: 4445
diff changeset
1044 int key_index = mxf->last_key_index;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1045
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1046 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
1047
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1048 if (!mxf->edit_units_count && !mxf->edit_unit_byte_count)
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1049 return;
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1050
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1051 put_buffer(pb, index_table_segment_key, 16);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1052
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1053 if (mxf->edit_unit_byte_count) {
4531
92ee3219998b do not write slice count when muxing cbr
bcoudurier
parents: 4530
diff changeset
1054 klv_encode_ber_length(pb, 80);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1055 } else {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1056 klv_encode_ber_length(pb, 85 + 12+(s->nb_streams+1)*6 +
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1057 12+mxf->edit_units_count*(11+mxf->slice_count*4));
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1058 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1059
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1060 // instance id
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1061 mxf_write_local_tag(pb, 16, 0x3C0A);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1062 mxf_write_uuid(pb, IndexTableSegment, 0);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1063
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1064 // index edit rate
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1065 mxf_write_local_tag(pb, 8, 0x3F0B);
4574
b330c2e275f9 fix index edit rate, inverse num and den
bcoudurier
parents: 4573
diff changeset
1066 put_be32(pb, mxf->time_base.den);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1067 put_be32(pb, mxf->time_base.num);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1068
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1069 // index start position
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1070 mxf_write_local_tag(pb, 8, 0x3F0C);
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1071 put_be64(pb, mxf->last_indexed_edit_unit);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1072
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1073 // index duration
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1074 mxf_write_local_tag(pb, 8, 0x3F0D);
5092
ad1e45ad8e5e set index duration to 0 for cbr, specifying whole container coverage
bcoudurier
parents: 5091
diff changeset
1075 if (mxf->edit_unit_byte_count)
ad1e45ad8e5e set index duration to 0 for cbr, specifying whole container coverage
bcoudurier
parents: 5091
diff changeset
1076 put_be64(pb, 0); // index table covers whole container
ad1e45ad8e5e set index duration to 0 for cbr, specifying whole container coverage
bcoudurier
parents: 5091
diff changeset
1077 else
ad1e45ad8e5e set index duration to 0 for cbr, specifying whole container coverage
bcoudurier
parents: 5091
diff changeset
1078 put_be64(pb, mxf->edit_units_count);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1079
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1080 // edit unit byte count
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1081 mxf_write_local_tag(pb, 4, 0x3F05);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1082 put_be32(pb, mxf->edit_unit_byte_count);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1083
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1084 // index sid
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1085 mxf_write_local_tag(pb, 4, 0x3F06);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1086 put_be32(pb, 2);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1087
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1088 // body sid
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1089 mxf_write_local_tag(pb, 4, 0x3F07);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1090 put_be32(pb, 1);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1091
4531
92ee3219998b do not write slice count when muxing cbr
bcoudurier
parents: 4530
diff changeset
1092 if (!mxf->edit_unit_byte_count) {
92ee3219998b do not write slice count when muxing cbr
bcoudurier
parents: 4530
diff changeset
1093 // real slice count - 1
92ee3219998b do not write slice count when muxing cbr
bcoudurier
parents: 4530
diff changeset
1094 mxf_write_local_tag(pb, 1, 0x3F08);
92ee3219998b do not write slice count when muxing cbr
bcoudurier
parents: 4530
diff changeset
1095 put_byte(pb, mxf->slice_count);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1096
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1097 // delta entry array
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1098 mxf_write_local_tag(pb, 8 + (s->nb_streams+1)*6, 0x3F09);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1099 put_be32(pb, s->nb_streams+1); // num of entries
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1100 put_be32(pb, 6); // size of one entry
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1101 // write system item delta entry
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1102 put_byte(pb, 0);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1103 put_byte(pb, 0); // slice entry
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1104 put_be32(pb, 0); // element delta
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1105 for (i = 0; i < s->nb_streams; i++) {
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1106 AVStream *st = s->streams[i];
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1107 MXFStreamContext *sc = st->priv_data;
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1108 put_byte(pb, sc->temporal_reordering);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1109 if (sc->temporal_reordering)
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1110 temporal_reordering = 1;
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1111 if (i == 0) { // video track
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1112 put_byte(pb, 0); // slice number
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1113 put_be32(pb, KAG_SIZE); // system item size including klv fill
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1114 } else { // audio track
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1115 unsigned audio_frame_size = sc->aic.samples[0]*sc->aic.sample_size;
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1116 audio_frame_size += klv_fill_size(audio_frame_size);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1117 put_byte(pb, 1);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1118 put_be32(pb, (i-1)*audio_frame_size); // element delta
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1119 }
4397
6d1626886974 only use 2 slices for index, one video(vbr) and one audio(cbr)
bcoudurier
parents: 4396
diff changeset
1120 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1121
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1122 mxf_write_local_tag(pb, 8 + mxf->edit_units_count*(11+mxf->slice_count*4), 0x3F0A);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1123 put_be32(pb, mxf->edit_units_count); // num of entries
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1124 put_be32(pb, 11+mxf->slice_count*4); // size of one entry
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1125
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1126 for (i = 0; i < mxf->edit_units_count; i++) {
5080
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1127 int temporal_offset = 0;
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1128
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1129 if (!(mxf->index_entries[i].flags & 0x33)) { // I frame
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1130 mxf->last_key_index = key_index;
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1131 key_index = i;
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1132 }
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1133
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1134 if (temporal_reordering) {
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1135 int pic_num_in_gop = i - key_index;
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1136 if (pic_num_in_gop != mxf->index_entries[i].temporal_ref) {
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1137 for (j = key_index; j < mxf->edit_units_count; j++) {
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1138 if (pic_num_in_gop == mxf->index_entries[j].temporal_ref)
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1139 break;
4344
582124bb2c15 fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents: 4343
diff changeset
1140 }
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1141 if (j == mxf->edit_units_count)
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1142 av_log(s, AV_LOG_WARNING, "missing frames\n");
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1143 temporal_offset = j - key_index - pic_num_in_gop;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1144 }
5080
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1145 }
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1146 put_byte(pb, temporal_offset);
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1147
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1148 if ((mxf->index_entries[i].flags & 0x30) == 0x30) { // back and forward prediction
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1149 put_byte(pb, mxf->last_key_index - i);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1150 } else {
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1151 put_byte(pb, key_index - i); // key frame offset
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1152 if ((mxf->index_entries[i].flags & 0x20) == 0x20) // only forward
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1153 mxf->last_key_index = key_index;
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1154 }
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1155
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1156 if (!(mxf->index_entries[i].flags & 0x33) && // I frame
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1157 mxf->index_entries[i].flags & 0x40 && !temporal_offset)
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1158 mxf->index_entries[i].flags |= 0x80; // random access
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1159 put_byte(pb, mxf->index_entries[i].flags);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1160 // stream offset
4481
27fd3af46000 compute body offset and index entry offset correctly
bcoudurier
parents: 4478
diff changeset
1161 put_be64(pb, mxf->index_entries[i].offset);
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1162 if (s->nb_streams > 1)
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1163 put_be32(pb, mxf->index_entries[i].slice_offset);
4378
490fde1dcbe5 fix key frame offset with open gop
bcoudurier
parents: 4376
diff changeset
1164 }
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1165
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1166 mxf->last_key_index = key_index - mxf->edit_units_count;
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1167 mxf->last_indexed_edit_unit += mxf->edit_units_count;
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1168 mxf->edit_units_count = 0;
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1169 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1170 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1171
4432
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1172 static void mxf_write_klv_fill(AVFormatContext *s)
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1173 {
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1174 unsigned pad = klv_fill_size(url_ftell(s->pb));
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1175 if (pad) {
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1176 put_buffer(s->pb, klv_fill_key, 16);
4469
49cf858ac430 encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents: 4461
diff changeset
1177 pad -= 16 + 4;
49cf858ac430 encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents: 4461
diff changeset
1178 klv_encode_ber4_length(s->pb, pad);
4432
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1179 for (; pad; pad--)
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1180 put_byte(s->pb, 0);
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1181 assert(!(url_ftell(s->pb) & (KAG_SIZE-1)));
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1182 }
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1183 }
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1184
4370
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1185 static void mxf_write_partition(AVFormatContext *s, int bodysid,
4439
4bc3b8687ec2 compute index byte count in mxf_write_partition
bcoudurier
parents: 4438
diff changeset
1186 int indexsid,
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1187 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
1188 {
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1189 MXFContext *mxf = s->priv_data;
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1190 ByteIOContext *pb = s->pb;
3843
b60ab685d415 remove header_byte_count_offset from context
bcoudurier
parents: 3842
diff changeset
1191 int64_t header_byte_count_offset;
4439
4bc3b8687ec2 compute index byte count in mxf_write_partition
bcoudurier
parents: 4438
diff changeset
1192 unsigned index_byte_count = 0;
4442
85f1c6887bef fix partition offset when only one stream present
bcoudurier
parents: 4441
diff changeset
1193 uint64_t partition_offset = url_ftell(pb);
4439
4bc3b8687ec2 compute index byte count in mxf_write_partition
bcoudurier
parents: 4438
diff changeset
1194
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1195 if (!mxf->edit_unit_byte_count && mxf->edit_units_count)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1196 index_byte_count = 85 + 12+(s->nb_streams+1)*6 +
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1197 12+mxf->edit_units_count*(11+mxf->slice_count*4);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1198 else if (mxf->edit_unit_byte_count && indexsid)
4537
6e217e9ca23d fix partition index byte count
bcoudurier
parents: 4536
diff changeset
1199 index_byte_count = 80;
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1200
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1201 if (index_byte_count) {
4439
4bc3b8687ec2 compute index byte count in mxf_write_partition
bcoudurier
parents: 4438
diff changeset
1202 // add encoded ber length
4bc3b8687ec2 compute index byte count in mxf_write_partition
bcoudurier
parents: 4438
diff changeset
1203 index_byte_count += 16 + klv_ber_length(index_byte_count);
4bc3b8687ec2 compute index byte count in mxf_write_partition
bcoudurier
parents: 4438
diff changeset
1204 index_byte_count += klv_fill_size(index_byte_count);
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1205 }
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1206
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1207 if (!memcmp(key, body_partition_key, 16)) {
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1208 mxf->body_partition_offset =
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1209 av_realloc(mxf->body_partition_offset,
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1210 (mxf->body_partitions_count+1)*
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1211 sizeof(*mxf->body_partition_offset));
4442
85f1c6887bef fix partition offset when only one stream present
bcoudurier
parents: 4441
diff changeset
1212 mxf->body_partition_offset[mxf->body_partitions_count++] = partition_offset;
4439
4bc3b8687ec2 compute index byte count in mxf_write_partition
bcoudurier
parents: 4438
diff changeset
1213 }
3812
1db39c874eb7 cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents: 3811
diff changeset
1214
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1215 // write klv
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1216 put_buffer(pb, key, 16);
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1217 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
1218
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1219 // write partition value
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1220 put_be16(pb, 1); // majorVersion
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1221 put_be16(pb, 2); // minorVersion
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1222 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
1223
4442
85f1c6887bef fix partition offset when only one stream present
bcoudurier
parents: 4441
diff changeset
1224 put_be64(pb, partition_offset); // ThisPartition
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1225
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1226 if (!memcmp(key, body_partition_key, 16) && mxf->body_partitions_count > 1)
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1227 put_be64(pb, mxf->body_partition_offset[mxf->body_partitions_count-2]); // PreviousPartition
4460
21945a5288cb check body partitions count before writing
bcoudurier
parents: 4449
diff changeset
1228 else if (!memcmp(key, footer_partition_key, 16) && mxf->body_partitions_count)
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1229 put_be64(pb, mxf->body_partition_offset[mxf->body_partitions_count-1]); // PreviousPartition
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1230 else
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1231 put_be64(pb, 0);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1232
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1233 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
1234
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1235 // set offset
3843
b60ab685d415 remove header_byte_count_offset from context
bcoudurier
parents: 3842
diff changeset
1236 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
1237 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
1238
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1239 // indexTable
4370
6c34e8045dc7 exactly compute index byte count
bcoudurier
parents: 4363
diff changeset
1240 put_be64(pb, index_byte_count); // indexByteCount
4439
4bc3b8687ec2 compute index byte count in mxf_write_partition
bcoudurier
parents: 4438
diff changeset
1241 put_be32(pb, index_byte_count ? indexsid : 0); // indexSID
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1242
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1243 // BodyOffset
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1244 if (bodysid && mxf->edit_units_count && mxf->body_partitions_count) {
4481
27fd3af46000 compute body offset and index entry offset correctly
bcoudurier
parents: 4478
diff changeset
1245 put_be64(pb, mxf->body_offset);
4445
f38371d76e4e fix body offset
bcoudurier
parents: 4442
diff changeset
1246 } else
f38371d76e4e fix body offset
bcoudurier
parents: 4442
diff changeset
1247 put_be64(pb, 0);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1248
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1249 put_be32(pb, bodysid); // bodySID
4430
d6fe53c5c8d2 correctly set multi track operational pattern
bcoudurier
parents: 4426
diff changeset
1250
d6fe53c5c8d2 correctly set multi track operational pattern
bcoudurier
parents: 4426
diff changeset
1251 // operational pattern
4536
b94bedbb59d7 always use multi track since timecode track is present
bcoudurier
parents: 4535
diff changeset
1252 put_buffer(pb, op1a_ul, 16);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1253
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1254 // essence container
3821
7a1f6dd123a9 simplify mxf_write_essence_container_refs
bcoudurier
parents: 3820
diff changeset
1255 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
1256
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1257 if (write_metadata) {
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1258 // mark the start of the headermetadata and calculate metadata size
4433
7ab5a6c4616b fix header byte count
bcoudurier
parents: 4432
diff changeset
1259 int64_t pos, start;
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1260 unsigned header_byte_count;
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1261
4432
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1262 mxf_write_klv_fill(s);
4433
7ab5a6c4616b fix header byte count
bcoudurier
parents: 4432
diff changeset
1263 start = url_ftell(s->pb);
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1264 mxf_write_primer_pack(s);
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1265 mxf_write_header_metadata_sets(s);
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1266 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
1267 header_byte_count = pos - start + klv_fill_size(pos);
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1268
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1269 // update header_byte_count
3843
b60ab685d415 remove header_byte_count_offset from context
bcoudurier
parents: 3842
diff changeset
1270 url_fseek(pb, header_byte_count_offset, SEEK_SET);
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1271 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
1272 url_fseek(pb, pos, SEEK_SET);
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1273 }
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1274
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1275 put_flush_packet(pb);
3760
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1276 }
fde28855a81e Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents: 3759
diff changeset
1277
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1278 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
1279 { 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
1280 { 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
1281 { 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
1282 { 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
1283 { 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
1284 { 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
1285 { 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
1286 { 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
1287 };
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1288
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1289 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
1290 {
5093
d4cce49ac1f1 fix and simplify long gop mpeg codec ul computation
bcoudurier
parents: 5092
diff changeset
1291 int long_gop = avctx->gop_size > 1 || avctx->has_b_frames;
d4cce49ac1f1 fix and simplify long gop mpeg codec ul computation
bcoudurier
parents: 5092
diff changeset
1292
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1293 if (avctx->profile == 4) { // Main
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1294 if (avctx->level == 8) // Main
5093
d4cce49ac1f1 fix and simplify long gop mpeg codec ul computation
bcoudurier
parents: 5092
diff changeset
1295 return &mxf_mpeg2_codec_uls[0+long_gop];
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1296 else if (avctx->level == 4) // High
5093
d4cce49ac1f1 fix and simplify long gop mpeg codec ul computation
bcoudurier
parents: 5092
diff changeset
1297 return &mxf_mpeg2_codec_uls[4+long_gop];
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1298 } 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
1299 if (avctx->level == 5) // Main
5093
d4cce49ac1f1 fix and simplify long gop mpeg codec ul computation
bcoudurier
parents: 5092
diff changeset
1300 return &mxf_mpeg2_codec_uls[2+long_gop];
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1301 else if (avctx->level == 2) // High
5093
d4cce49ac1f1 fix and simplify long gop mpeg codec ul computation
bcoudurier
parents: 5092
diff changeset
1302 return &mxf_mpeg2_codec_uls[6+long_gop];
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1303 }
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1304 return NULL;
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1305 }
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1306
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1307 static int mxf_parse_mpeg2_frame(AVFormatContext *s, AVStream *st,
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1308 AVPacket *pkt, MXFIndexEntry *e)
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1309 {
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1310 MXFStreamContext *sc = st->priv_data;
4449
aaae79b414f3 parse mpeg2 gop header time code and use it
bcoudurier
parents: 4448
diff changeset
1311 MXFContext *mxf = s->priv_data;
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1312 uint32_t c = -1;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1313 int i;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1314
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1315 for(i = 0; i < pkt->size - 4; i++) {
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1316 c = (c<<8) + pkt->data[i];
5081
56f6b1d56db9 cosmetics, change case and comments alignment
bcoudurier
parents: 5080
diff changeset
1317 if (c == 0x1b5) {
4938
d7c5a47fe9c2 remove unneeded length checks
bcoudurier
parents: 4716
diff changeset
1318 if ((pkt->data[i+1] & 0xf0) == 0x10) { // seq ext
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1319 st->codec->profile = pkt->data[i+1] & 0x07;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1320 st->codec->level = pkt->data[i+2] >> 4;
4314
dfa0afd806c5 parse mpeg2 progressive frame flag
bcoudurier
parents: 4313
diff changeset
1321 } 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
1322 sc->interlaced = !(pkt->data[i+5] & 0x80); // progressive frame
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1323 break;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1324 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1325 } else if (c == 0x1b8) { // gop
5080
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1326 if (pkt->data[i+4]>>6 & 0x01) { // closed
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1327 sc->closed_gop = 1;
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1328 if (e->flags & 0x40) // sequence header present
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1329 e->flags |= 0x80; // random access
5080
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1330 }
4939
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1331 if (!mxf->header_written) {
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1332 unsigned hours = (pkt->data[i+1]>>2) & 0x1f;
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1333 unsigned minutes = ((pkt->data[i+1] & 0x03) << 4) | (pkt->data[i+2]>>4);
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1334 unsigned seconds = ((pkt->data[i+2] & 0x07) << 3) | (pkt->data[i+3]>>5);
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1335 unsigned frames = ((pkt->data[i+3] & 0x1f) << 1) | (pkt->data[i+4]>>7);
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1336 mxf->timecode_drop_frame = !!(pkt->data[i+1] & 0x80);
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1337 mxf->timecode_start = (hours*3600 + minutes*60 + seconds) *
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1338 mxf->timecode_base + frames;
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1339 if (mxf->timecode_drop_frame) {
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1340 unsigned tminutes = 60 * hours + minutes;
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1341 mxf->timecode_start -= 2 * (tminutes - tminutes / 10);
4449
aaae79b414f3 parse mpeg2 gop header time code and use it
bcoudurier
parents: 4448
diff changeset
1342 }
4939
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1343 av_log(s, AV_LOG_DEBUG, "frame %d %d:%d:%d%c%d\n", mxf->timecode_start,
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1344 hours, minutes, seconds, mxf->timecode_drop_frame ? ';':':', frames);
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1345 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1346 } else if (c == 0x1b3) { // seq
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1347 e->flags |= 0x40;
4939
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1348 switch ((pkt->data[i+4]>>4) & 0xf) {
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1349 case 2: sc->aspect_ratio = (AVRational){ 4, 3}; break;
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1350 case 3: sc->aspect_ratio = (AVRational){ 16, 9}; break;
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1351 case 4: sc->aspect_ratio = (AVRational){221,100}; break;
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1352 default:
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1353 av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den,
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1354 st->codec->width, st->codec->height, 1024*1024);
d10d934600db reindent
bcoudurier
parents: 4938
diff changeset
1355 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1356 } else if (c == 0x100) { // pic
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1357 int pict_type = (pkt->data[i+2]>>3) & 0x07;
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1358 e->temporal_ref = (pkt->data[i+1]<<2) | (pkt->data[i+2]>>6);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1359 if (pict_type == 2) { // P frame
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1360 e->flags |= 0x22;
5080
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1361 sc->closed_gop = 0; // reset closed gop, don't matter anymore
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1362 } else if (pict_type == 3) { // B frame
5080
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1363 if (sc->closed_gop)
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1364 e->flags |= 0x13; // only backward prediction
5080
7c69c9335983 correctly compute frame flags with closed gop
bcoudurier
parents: 4950
diff changeset
1365 else
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1366 e->flags |= 0x33;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1367 sc->temporal_reordering = -1;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1368 } else if (!pict_type) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1369 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
1370 return 0;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1371 }
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1372 }
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1373 }
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1374 if (s->oformat != &mxf_d10_muxer)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1375 sc->codec_ul = mxf_get_mpeg2_codec_ul(st->codec);
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1376 return !!sc->codec_ul;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1377 }
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1378
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1379 static uint64_t mxf_parse_timestamp(time_t timestamp)
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1380 {
4716
7c99a46b3f3d use utc time for timestamp and do not set it if not specified
bcoudurier
parents: 4713
diff changeset
1381 struct tm *time = gmtime(&timestamp);
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1382 return (uint64_t)(time->tm_year+1900) << 48 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1383 (uint64_t)(time->tm_mon+1) << 40 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1384 (uint64_t) time->tm_mday << 32 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1385 time->tm_hour << 24 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1386 time->tm_min << 16 |
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1387 time->tm_sec << 8;
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1388 }
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1389
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1390 static void mxf_gen_umid(AVFormatContext *s)
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1391 {
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1392 MXFContext *mxf = s->priv_data;
6036
201152a121b5 Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 5910
diff changeset
1393 uint32_t seed = av_get_random_seed();
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1394 uint64_t umid = seed + 0x5294713400000000LL;
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1395
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1396 AV_WB64(mxf->umid , umid);
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1397 AV_WB64(mxf->umid+8, umid>>8);
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1398
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1399 mxf->instance_number = seed;
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1400 }
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1401
3836
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1402 static int mxf_write_header(AVFormatContext *s)
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1403 {
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1404 MXFContext *mxf = s->priv_data;
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1405 int i;
4001
fcb9de59245f uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 3908
diff changeset
1406 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
1407 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
1408
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1409 if (!s->nb_streams)
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1410 return -1;
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1411
3816
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1412 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
1413 AVStream *st = s->streams[i];
3824
f1270349f49f replace sizeof(type) by sizeof *ptr
bcoudurier
parents: 3823
diff changeset
1414 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
1415 if (!sc)
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1416 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
1417 st->priv_data = sc;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1418
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5602
diff changeset
1419 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
4396
a34ee37a164e force first track to be video and simplify
bcoudurier
parents: 4395
diff changeset
1420 if (i != 0) {
a34ee37a164e force first track to be video and simplify
bcoudurier
parents: 4395
diff changeset
1421 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
1422 return -1;
a34ee37a164e force first track to be video and simplify
bcoudurier
parents: 4395
diff changeset
1423 }
4363
8142fb82cd75 be more flexible with frame rate check
bcoudurier
parents: 4351
diff changeset
1424 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
1425 samples_per_frame = PAL_samples_per_frame;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1426 mxf->time_base = (AVRational){ 1, 25 };
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1427 mxf->timecode_base = 25;
4363
8142fb82cd75 be more flexible with frame rate check
bcoudurier
parents: 4351
diff changeset
1428 } 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
1429 samples_per_frame = NTSC_samples_per_frame;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1430 mxf->time_base = (AVRational){ 1001, 30000 };
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1431 mxf->timecode_base = 30;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1432 } else {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1433 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
1434 return -1;
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 av_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1437 if (s->oformat == &mxf_d10_muxer) {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1438 if (st->codec->bit_rate == 50000000)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1439 if (mxf->time_base.den == 25) sc->index = 3;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1440 else sc->index = 5;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1441 else if (st->codec->bit_rate == 40000000)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1442 if (mxf->time_base.den == 25) sc->index = 7;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1443 else sc->index = 9;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1444 else if (st->codec->bit_rate == 30000000)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1445 if (mxf->time_base.den == 25) sc->index = 11;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1446 else sc->index = 13;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1447 else {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1448 av_log(s, AV_LOG_ERROR, "error MXF D-10 only support 30/40/50 mbit/s\n");
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1449 return -1;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1450 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1451
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1452 mxf->edit_unit_byte_count = KAG_SIZE; // system element
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1453 mxf->edit_unit_byte_count += 16 + 4 + (uint64_t)st->codec->bit_rate *
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1454 mxf->time_base.num / (8*mxf->time_base.den);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1455 mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1456 mxf->edit_unit_byte_count += 16 + 4 + 4 + samples_per_frame[0]*8*4;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1457 mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1458 }
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5602
diff changeset
1459 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1460 if (st->codec->sample_rate != 48000) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1461 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
1462 return -1;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1463 }
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1464 av_set_pts_info(st, 64, 1, st->codec->sample_rate);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1465 if (s->oformat == &mxf_d10_muxer) {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1466 if (st->index != 1) {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1467 av_log(s, AV_LOG_ERROR, "MXF D-10 only support one audio track\n");
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1468 return -1;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1469 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1470 if (st->codec->codec_id != CODEC_ID_PCM_S16LE &&
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1471 st->codec->codec_id != CODEC_ID_PCM_S24LE) {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1472 av_log(s, AV_LOG_ERROR, "MXF D-10 only support 16 or 24 bits le audio\n");
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1473 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1474 sc->index = ((MXFStreamContext*)s->streams[0]->priv_data)->index + 1;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1475 } else
4397
6d1626886974 only use 2 slices for index, one video(vbr) and one audio(cbr)
bcoudurier
parents: 4396
diff changeset
1476 mxf->slice_count = 1;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1477 }
3834
d49f55ab650c set duration to distinguished value
bcoudurier
parents: 3833
diff changeset
1478
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1479 if (!sc->index) {
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1480 sc->index = mxf_get_essence_container_ul_index(st->codec->codec_id);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1481 if (sc->index == -1) {
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1482 av_log(s, AV_LOG_ERROR, "track %d: could not find essence container ul, "
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1483 "codec not currently supported in container\n", i);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1484 return -1;
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1485 }
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1486 }
3833
8b3fdbc81f3e correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents: 3832
diff changeset
1487
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1488 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
1489
3846
0ee95f0b4c00 store index in table in MXFStreamContext, simplify
bcoudurier
parents: 3845
diff changeset
1490 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
1491 sc->track_essence_element_key[15] = present[sc->index];
3826
da2d0c162cde introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents: 3825
diff changeset
1492 PRINT_KEY(s, "track essence element key", sc->track_essence_element_key);
4533
23ec193c3e0a start counting track number from 0
bcoudurier
parents: 4532
diff changeset
1493
23ec193c3e0a start counting track number from 0
bcoudurier
parents: 4532
diff changeset
1494 if (!present[sc->index])
23ec193c3e0a start counting track number from 0
bcoudurier
parents: 4532
diff changeset
1495 mxf->essence_container_count++;
23ec193c3e0a start counting track number from 0
bcoudurier
parents: 4532
diff changeset
1496 present[sc->index]++;
3816
50bdbde13ecf move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents: 3815
diff changeset
1497 }
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1498
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1499 if (s->oformat == &mxf_d10_muxer) {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1500 mxf->essence_container_count = 1;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1501 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1502
4716
7c99a46b3f3d use utc time for timestamp and do not set it if not specified
bcoudurier
parents: 4713
diff changeset
1503 if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT))
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1504 mxf_gen_umid(s);
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1505
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1506 for (i = 0; i < s->nb_streams; i++) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1507 MXFStreamContext *sc = s->streams[i]->priv_data;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1508 // update element count
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1509 sc->track_essence_element_key[13] = present[sc->index];
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1510 sc->order = AV_RB32(sc->track_essence_element_key+12);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1511 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1512
4716
7c99a46b3f3d use utc time for timestamp and do not set it if not specified
bcoudurier
parents: 4713
diff changeset
1513 if (s->timestamp)
7c99a46b3f3d use utc time for timestamp and do not set it if not specified
bcoudurier
parents: 4713
diff changeset
1514 mxf->timestamp = mxf_parse_timestamp(s->timestamp);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1515 mxf->duration = -1;
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1516
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1517 mxf->timecode_track = av_mallocz(sizeof(*mxf->timecode_track));
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1518 if (!mxf->timecode_track)
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1519 return AVERROR(ENOMEM);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1520 mxf->timecode_track->priv_data = av_mallocz(sizeof(MXFStreamContext));
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1521 if (!mxf->timecode_track->priv_data)
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1522 return AVERROR(ENOMEM);
4529
ade95792aa16 use index 0 for timecode track and write it in source package also
bcoudurier
parents: 4528
diff changeset
1523 mxf->timecode_track->index = -1;
4385
e8e064a00ea5 format timestamp correctly according to specs and set it
bcoudurier
parents: 4384
diff changeset
1524
4327
60bad0ded22a do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents: 4326
diff changeset
1525 if (!samples_per_frame)
60bad0ded22a do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents: 4326
diff changeset
1526 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
1527
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1528 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
1529 return -1;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1530
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1531 return 0;
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1532 }
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1533
4395
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1534 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
1535 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
1536
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1537 static uint32_t ff_framenum_to_12m_time_code(unsigned frame, int drop, int fps)
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1538 {
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1539 return (0 << 31) | // color frame flag
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1540 (0 << 30) | // drop frame flag
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1541 ( ((frame % fps) / 10) << 28) | // tens of frames
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1542 ( ((frame % fps) % 10) << 24) | // units of frames
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1543 (0 << 23) | // field phase (NTSC), b0 (PAL)
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1544 ((((frame / fps) % 60) / 10) << 20) | // tens of seconds
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1545 ((((frame / fps) % 60) % 10) << 16) | // units of seconds
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1546 (0 << 15) | // b0 (NTSC), b2 (PAL)
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1547 ((((frame / (fps * 60)) % 60) / 10) << 12) | // tens of minutes
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1548 ((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1549 (0 << 7) | // b1
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1550 (0 << 6) | // b2 (NSC), field phase (PAL)
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1551 ((((frame / (fps * 3600) % 24)) / 10) << 4) | // tens of hours
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1552 ( (frame / (fps * 3600) % 24)) % 10; // units of hours
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1553 }
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1554
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1555 static void mxf_write_system_item(AVFormatContext *s)
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1556 {
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1557 MXFContext *mxf = s->priv_data;
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1558 ByteIOContext *pb = s->pb;
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1559 unsigned frame;
4395
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1560 uint32_t time_code;
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1561
4449
aaae79b414f3 parse mpeg2 gop header time code and use it
bcoudurier
parents: 4448
diff changeset
1562 frame = mxf->timecode_start + mxf->last_indexed_edit_unit + mxf->edit_units_count;
4395
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1563
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1564 // write system metadata pack
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1565 put_buffer(pb, system_metadata_pack_key, 16);
4470
1c6dd9d7a634 write essence elements klv packets with ber4 length, more interoperable
bcoudurier
parents: 4469
diff changeset
1566 klv_encode_ber4_length(pb, 57);
4395
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1567 put_byte(pb, 0x5c); // UL, user date/time stamp, picture and sound item present
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1568 put_byte(pb, 0x04); // content package rate
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1569 put_byte(pb, 0x00); // content package type
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1570 put_be16(pb, 0x00); // channel handle
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1571 put_be16(pb, frame); // continuity count
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1572 if (mxf->essence_container_count > 1)
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1573 put_buffer(pb, multiple_desc_ul, 16);
4475
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
1574 else {
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
1575 MXFStreamContext *sc = s->streams[0]->priv_data;
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
1576 put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
fc3806848a49 simplify
bcoudurier
parents: 4474
diff changeset
1577 }
4395
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1578 put_byte(pb, 0);
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1579 put_be64(pb, 0);
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1580 put_be64(pb, 0); // creation date/time stamp
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1581
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1582 put_byte(pb, 0x81); // SMPTE 12M time code
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1583 time_code = ff_framenum_to_12m_time_code(frame, mxf->timecode_drop_frame, mxf->timecode_base);
4395
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1584 put_be32(pb, time_code);
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1585 put_be32(pb, 0); // binary group data
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1586 put_be64(pb, 0);
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1587
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1588 // write system metadata package set
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1589 put_buffer(pb, system_metadata_package_set_key, 16);
4470
1c6dd9d7a634 write essence elements klv packets with ber4 length, more interoperable
bcoudurier
parents: 4469
diff changeset
1590 klv_encode_ber4_length(pb, 35);
4395
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1591 put_byte(pb, 0x83); // UMID
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1592 put_be16(pb, 0x20);
4696
ee1ca2a4e43f attempt to try to generate an random umid
bcoudurier
parents: 4574
diff changeset
1593 mxf_write_umid(s, 1);
4395
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1594 }
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1595
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1596 static void mxf_write_d10_video_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1597 {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1598 MXFContext *mxf = s->priv_data;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1599 ByteIOContext *pb = s->pb;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1600 int packet_size = (uint64_t)st->codec->bit_rate*mxf->time_base.num /
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1601 (8*mxf->time_base.den); // frame size
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1602 int pad;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1603
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1604 packet_size += 16 + 4;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1605 packet_size += klv_fill_size(packet_size);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1606
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1607 klv_encode_ber4_length(pb, pkt->size);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1608 put_buffer(pb, pkt->data, pkt->size);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1609
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1610 // ensure CBR muxing by padding to correct video frame size
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1611 pad = packet_size - pkt->size - 16 - 4;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1612 if (pad > 20) {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1613 put_buffer(s->pb, klv_fill_key, 16);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1614 pad -= 16 + 4;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1615 klv_encode_ber4_length(s->pb, pad);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1616 for (; pad; pad--)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1617 put_byte(s->pb, 0);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1618 assert(!(url_ftell(s->pb) & (KAG_SIZE-1)));
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1619 } else {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1620 av_log(s, AV_LOG_WARNING, "cannot fill d-10 video packet\n");
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1621 for (; pad > 0; pad--)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1622 put_byte(s->pb, 0);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1623 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1624 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1625
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1626 static void mxf_write_d10_audio_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1627 {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1628 MXFContext *mxf = s->priv_data;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1629 ByteIOContext *pb = s->pb;
4573
3e1796a40c4d simplify, use codec->block_align
bcoudurier
parents: 4572
diff changeset
1630 int frame_size = pkt->size / st->codec->block_align;
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1631 uint8_t *samples = pkt->data;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1632 uint8_t *end = pkt->data + pkt->size;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1633 int i;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1634
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1635 klv_encode_ber4_length(pb, 4 + frame_size*4*8);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1636
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1637 put_byte(pb, (frame_size == 1920 ? 0 : (mxf->edit_units_count-1) % 5 + 1));
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1638 put_le16(pb, frame_size);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1639 put_byte(pb, (1<<st->codec->channels)-1);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1640
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1641 while (samples < end) {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1642 for (i = 0; i < st->codec->channels; i++) {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1643 uint32_t sample;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1644 if (st->codec->codec_id == CODEC_ID_PCM_S24LE) {
4571
d870b1e4b731 do not set frame start bit since marked as not used and factorize
bcoudurier
parents: 4565
diff changeset
1645 sample = AV_RL24(samples)<< 4;
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1646 samples += 3;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1647 } else {
4571
d870b1e4b731 do not set frame start bit since marked as not used and factorize
bcoudurier
parents: 4565
diff changeset
1648 sample = AV_RL16(samples)<<12;
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1649 samples += 2;
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1650 }
4571
d870b1e4b731 do not set frame start bit since marked as not used and factorize
bcoudurier
parents: 4565
diff changeset
1651 put_le32(pb, sample | i);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1652 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1653 for (; i < 8; i++)
4572
f3b6979fee40 set channel number even for inactive channels
bcoudurier
parents: 4571
diff changeset
1654 put_le32(pb, i);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1655 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1656 }
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1657
3836
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1658 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
1659 {
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1660 MXFContext *mxf = s->priv_data;
3778
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1661 ByteIOContext *pb = s->pb;
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1662 AVStream *st = s->streams[pkt->stream_index];
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1663 MXFStreamContext *sc = st->priv_data;
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1664 MXFIndexEntry ie = {0};
3778
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1665
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1666 if (!mxf->edit_unit_byte_count && !(mxf->edit_units_count % EDIT_UNITS_PER_BODY)) {
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1667 mxf->index_entries = av_realloc(mxf->index_entries,
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1668 (mxf->edit_units_count + EDIT_UNITS_PER_BODY)*sizeof(*mxf->index_entries));
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1669 if (!mxf->index_entries) {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1670 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
1671 return -1;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1672 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1673 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1674
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1675 if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO) {
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1676 if (!mxf_parse_mpeg2_frame(s, st, pkt, &ie)) {
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1677 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
1678 return -1;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1679 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1680 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1681
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1682 if (!mxf->header_written) {
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1683 if (mxf->edit_unit_byte_count) {
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1684 mxf_write_partition(s, 1, 2, header_open_partition_key, 1);
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1685 mxf_write_klv_fill(s);
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1686 mxf_write_index_table_segment(s);
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1687 } else {
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1688 mxf_write_partition(s, 0, 0, header_open_partition_key, 1);
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1689 }
4313
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1690 mxf->header_written = 1;
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1691 }
bdb984bfa3ed delay header writing and parse mpeg2 frame
bcoudurier
parents: 4312
diff changeset
1692
4396
a34ee37a164e force first track to be video and simplify
bcoudurier
parents: 4395
diff changeset
1693 if (st->index == 0) {
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1694 if (!mxf->edit_unit_byte_count &&
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1695 (!mxf->edit_units_count || mxf->edit_units_count > EDIT_UNITS_PER_BODY) &&
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1696 !(ie.flags & 0x33)) { // I frame, Gop start
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1697 mxf_write_klv_fill(s);
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1698 mxf_write_partition(s, 1, 2, body_partition_key, 0);
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1699
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1700 mxf_write_klv_fill(s);
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1701 mxf_write_index_table_segment(s);
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1702 }
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1703
4436
98928aca0df9 10l, edit unit offset is after klv fill
bcoudurier
parents: 4435
diff changeset
1704 mxf_write_klv_fill(s);
4395
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1705 mxf_write_system_item(s);
2a72b8b7a69d write system item
bcoudurier
parents: 4393
diff changeset
1706
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1707 if (!mxf->edit_unit_byte_count) {
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1708 mxf->index_entries[mxf->edit_units_count].offset = mxf->body_offset;
6214
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1709 mxf->index_entries[mxf->edit_units_count].flags = ie.flags;
23e04fb7656e In mxf muxer, fix last b frame temporal offset
bcoudurier
parents: 6036
diff changeset
1710 mxf->index_entries[mxf->edit_units_count].temporal_ref = ie.temporal_ref;
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1711 mxf->body_offset += KAG_SIZE; // size of system element
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1712 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1713 mxf->edit_units_count++;
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1714 } else if (!mxf->edit_unit_byte_count && st->index == 1) {
4481
27fd3af46000 compute body offset and index entry offset correctly
bcoudurier
parents: 4478
diff changeset
1715 mxf->index_entries[mxf->edit_units_count-1].slice_offset =
27fd3af46000 compute body offset and index entry offset correctly
bcoudurier
parents: 4478
diff changeset
1716 mxf->body_offset - mxf->index_entries[mxf->edit_units_count-1].offset;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1717 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1718
4435
4f96c60c9561 cosmetics, associate mxf_write_klv_fill to aligned elements
bcoudurier
parents: 4434
diff changeset
1719 mxf_write_klv_fill(s);
3778
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1720 put_buffer(pb, sc->track_essence_element_key, 16); // write key
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1721 if (s->oformat == &mxf_d10_muxer) {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5602
diff changeset
1722 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1723 mxf_write_d10_video_packet(s, st, pkt);
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1724 else
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1725 mxf_write_d10_audio_packet(s, st, pkt);
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1726 } else {
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1727 klv_encode_ber4_length(pb, pkt->size); // write length
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1728 put_buffer(pb, pkt->data, pkt->size);
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1729 mxf->body_offset += 16+4+pkt->size + klv_fill_size(16+4+pkt->size);
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1730 }
3778
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1731
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1732 put_flush_packet(pb);
4481
27fd3af46000 compute body offset and index entry offset correctly
bcoudurier
parents: 4478
diff changeset
1733
3778
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1734 return 0;
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1735 }
85d3aca03313 Import more MXF muxer code from the SoC tree
vitor
parents: 3760
diff changeset
1736
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1737 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
1738 {
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1739 MXFContext *mxf = s->priv_data;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1740 ByteIOContext *pb = s->pb;
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1741 uint64_t pos = url_ftell(pb);
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1742 int i;
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1743
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1744 put_buffer(pb, random_index_pack_key, 16);
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1745 klv_encode_ber_length(pb, 28 + 12*mxf->body_partitions_count);
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1746
4528
6495e0111859 fix rip body sid when muxing cbr
bcoudurier
parents: 4527
diff changeset
1747 if (mxf->edit_unit_byte_count)
6495e0111859 fix rip body sid when muxing cbr
bcoudurier
parents: 4527
diff changeset
1748 put_be32(pb, 1); // BodySID of header partition
6495e0111859 fix rip body sid when muxing cbr
bcoudurier
parents: 4527
diff changeset
1749 else
4532
32f00d63e3cd remove redundant comment
bcoudurier
parents: 4531
diff changeset
1750 put_be32(pb, 0);
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1751 put_be64(pb, 0); // offset of header partition
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1752
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1753 for (i = 0; i < mxf->body_partitions_count; i++) {
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1754 put_be32(pb, 1); // BodySID
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1755 put_be64(pb, mxf->body_partition_offset[i]);
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1756 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1757
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1758 put_be32(pb, 0); // BodySID of footer partition
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1759 put_be64(pb, mxf->footer_partition_offset);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1760
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1761 put_be32(pb, url_ftell(pb) - pos + 4);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1762 }
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1763
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1764 static int mxf_write_footer(AVFormatContext *s)
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1765 {
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1766 MXFContext *mxf = s->priv_data;
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1767 ByteIOContext *pb = s->pb;
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1768
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1769 mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count;
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1770
4393
87a896580005 use 512 kag size needed for d10
bcoudurier
parents: 4385
diff changeset
1771 mxf_write_klv_fill(s);
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1772 mxf->footer_partition_offset = url_ftell(pb);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1773 if (mxf->edit_unit_byte_count) { // no need to repeat index
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1774 mxf_write_partition(s, 0, 0, footer_partition_key, 0);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1775 } else {
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1776 mxf_write_partition(s, 0, 2, footer_partition_key, 0);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1777
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1778 mxf_write_klv_fill(s);
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1779 mxf_write_index_table_segment(s);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1780 }
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1781
4432
f8ba6cf226e7 move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents: 4431
diff changeset
1782 mxf_write_klv_fill(s);
4341
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1783 mxf_write_random_index_pack(s);
501d1dd19021 write index table and rip, muxer works pretty well now
bcoudurier
parents: 4340
diff changeset
1784
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1785 if (!url_is_streamed(s->pb)) {
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1786 url_fseek(pb, 0, SEEK_SET);
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1787 if (mxf->edit_unit_byte_count) {
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1788 mxf_write_partition(s, 1, 2, header_closed_partition_key, 1);
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1789 mxf_write_klv_fill(s);
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1790 mxf_write_index_table_segment(s);
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1791 } else {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1792 mxf_write_partition(s, 0, 0, header_closed_partition_key, 1);
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1793 }
3842
c4e0e02a4832 simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents: 3841
diff changeset
1794 }
4330
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1795
4530
9ca76e4777db flush pending write in mxf_write_footer
bcoudurier
parents: 4529
diff changeset
1796 put_flush_packet(pb);
9ca76e4777db flush pending write in mxf_write_footer
bcoudurier
parents: 4529
diff changeset
1797
4330
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1798 ff_audio_interleave_close(s);
f59a2165d042 free audio fifo
bcoudurier
parents: 4328
diff changeset
1799
4402
671d415e1786 free index entries
bcoudurier
parents: 4400
diff changeset
1800 av_freep(&mxf->index_entries);
4440
64f62c9643c3 write body partitions
bcoudurier
parents: 4439
diff changeset
1801 av_freep(&mxf->body_partition_offset);
4448
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1802 av_freep(&mxf->timecode_track->priv_data);
587ce9359a9b write timecode track
bcoudurier
parents: 4446
diff changeset
1803 av_freep(&mxf->timecode_track);
4402
671d415e1786 free index entries
bcoudurier
parents: 4400
diff changeset
1804
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1805 mxf_free(s);
4474
cfd03b6fab13 cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents: 4473
diff changeset
1806
3740
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1807 return 0;
b31821aa2235 Ok-ed parts from patch by zhentan feng.
cehoyos
parents: 3735
diff changeset
1808 }
3749
84ad19dea09f Apply parts of MXF muxer ok'ed by Michael
vitor
parents: 3743
diff changeset
1809
4328
fb0fde31327a change prototype of mxf_interleave_get_packet to make it compatible
bcoudurier
parents: 4327
diff changeset
1810 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
1811 {
5602
0e84f356ca5f Remove MAX_STREAMS usage in ogg and mxf muxers
bcoudurier
parents: 5359
diff changeset
1812 int i, stream_count = 0;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1813
5602
0e84f356ca5f Remove MAX_STREAMS usage in ogg and mxf muxers
bcoudurier
parents: 5359
diff changeset
1814 for (i = 0; i < s->nb_streams; i++)
0e84f356ca5f Remove MAX_STREAMS usage in ogg and mxf muxers
bcoudurier
parents: 5359
diff changeset
1815 stream_count += !!s->streams[i]->last_in_packet_buffer;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1816
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1817 if (stream_count && (s->nb_streams == stream_count || flush)) {
5602
0e84f356ca5f Remove MAX_STREAMS usage in ogg and mxf muxers
bcoudurier
parents: 5359
diff changeset
1818 AVPacketList *pktl = s->packet_buffer;
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1819 if (s->nb_streams != stream_count) {
4461
f21c01140f2d set last packet next pointer to null
bcoudurier
parents: 4460
diff changeset
1820 AVPacketList *last = NULL;
4500
cc4b6d42dcd5 fix mxf interleaving packet purge
bcoudurier
parents: 4481
diff changeset
1821 // find last packet in edit unit
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1822 while (pktl) {
4500
cc4b6d42dcd5 fix mxf interleaving packet purge
bcoudurier
parents: 4481
diff changeset
1823 if (!stream_count || pktl->pkt.stream_index == 0)
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1824 break;
4461
f21c01140f2d set last packet next pointer to null
bcoudurier
parents: 4460
diff changeset
1825 last = pktl;
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1826 pktl = pktl->next;
4500
cc4b6d42dcd5 fix mxf interleaving packet purge
bcoudurier
parents: 4481
diff changeset
1827 stream_count--;
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1828 }
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1829 // purge packet queue
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1830 while (pktl) {
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1831 AVPacketList *next = pktl->next;
5210
36d130853c9b Improve amortized worst case speed of the muxers packet interleaving code
michael
parents: 5093
diff changeset
1832
36d130853c9b Improve amortized worst case speed of the muxers packet interleaving code
michael
parents: 5093
diff changeset
1833 if(s->streams[pktl->pkt.stream_index]->last_in_packet_buffer == pktl)
36d130853c9b Improve amortized worst case speed of the muxers packet interleaving code
michael
parents: 5093
diff changeset
1834 s->streams[pktl->pkt.stream_index]->last_in_packet_buffer= NULL;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1835 av_free_packet(&pktl->pkt);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1836 av_freep(&pktl);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1837 pktl = next;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1838 }
4500
cc4b6d42dcd5 fix mxf interleaving packet purge
bcoudurier
parents: 4481
diff changeset
1839 if (last)
cc4b6d42dcd5 fix mxf interleaving packet purge
bcoudurier
parents: 4481
diff changeset
1840 last->next = NULL;
cc4b6d42dcd5 fix mxf interleaving packet purge
bcoudurier
parents: 4481
diff changeset
1841 else {
cc4b6d42dcd5 fix mxf interleaving packet purge
bcoudurier
parents: 4481
diff changeset
1842 s->packet_buffer = NULL;
5210
36d130853c9b Improve amortized worst case speed of the muxers packet interleaving code
michael
parents: 5093
diff changeset
1843 s->packet_buffer_end= NULL;
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1844 goto out;
4500
cc4b6d42dcd5 fix mxf interleaving packet purge
bcoudurier
parents: 4481
diff changeset
1845 }
cc4b6d42dcd5 fix mxf interleaving packet purge
bcoudurier
parents: 4481
diff changeset
1846 pktl = s->packet_buffer;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1847 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1848
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1849 *out = pktl->pkt;
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1850 //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
1851 s->packet_buffer = pktl->next;
5210
36d130853c9b Improve amortized worst case speed of the muxers packet interleaving code
michael
parents: 5093
diff changeset
1852 if(s->streams[pktl->pkt.stream_index]->last_in_packet_buffer == pktl)
36d130853c9b Improve amortized worst case speed of the muxers packet interleaving code
michael
parents: 5093
diff changeset
1853 s->streams[pktl->pkt.stream_index]->last_in_packet_buffer= NULL;
36d130853c9b Improve amortized worst case speed of the muxers packet interleaving code
michael
parents: 5093
diff changeset
1854 if(!s->packet_buffer)
36d130853c9b Improve amortized worst case speed of the muxers packet interleaving code
michael
parents: 5093
diff changeset
1855 s->packet_buffer_end= NULL;
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1856 av_freep(&pktl);
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1857 return 1;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1858 } else {
4342
b889db531b8f fix flush and interleaving by edit units
bcoudurier
parents: 4341
diff changeset
1859 out:
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1860 av_init_packet(out);
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1861 return 0;
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1862 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1863 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1864
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1865 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
1866 {
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1867 MXFStreamContext *sc = s->streams[pkt ->stream_index]->priv_data;
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1868 MXFStreamContext *sc2 = s->streams[next->stream_index]->priv_data;
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1869
4374
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1870 return next->dts > pkt->dts ||
1664a812629f use sample rate as audio input time base
bcoudurier
parents: 4370
diff changeset
1871 (next->dts == pkt->dts && sc->order < sc2->order);
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1872 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1873
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1874 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
1875 {
4426
7854590fb1fd rename ff_audio_interleave to ff_audio_rechunk_interleave
bcoudurier
parents: 4408
diff changeset
1876 return ff_audio_rechunk_interleave(s, out, pkt, flush,
4400
65adb9e5214f extract audio interleaving code from mxf muxer, will be used by gxf and dv
bcoudurier
parents: 4397
diff changeset
1877 mxf_interleave_get_packet, mxf_compare_timestamps);
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1878 }
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1879
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1880 AVOutputFormat mxf_muxer = {
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1881 "mxf",
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1882 NULL_IF_CONFIG_SMALL("Material eXchange Format"),
4476
b9d03c68660b set mime type for mxf
bcoudurier
parents: 4475
diff changeset
1883 "application/mxf",
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1884 "mxf",
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1885 sizeof(MXFContext),
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1886 CODEC_ID_PCM_S16LE,
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1887 CODEC_ID_MPEG2VIDEO,
3836
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1888 mxf_write_header,
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1889 mxf_write_packet,
778af58056b6 cosmetics, mux_write -> mxf_write
bcoudurier
parents: 3835
diff changeset
1890 mxf_write_footer,
4350
b7fdb211ba7b mxf does not have timestamps
bcoudurier
parents: 4346
diff changeset
1891 AVFMT_NOTIMESTAMPS,
4312
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1892 NULL,
385b2fdccbbb correctly pack and interleave pcm samples in mxf
bcoudurier
parents: 4279
diff changeset
1893 mxf_interleave,
3721
caecb9f780a1 import ok'd hunks for mxf muxer
bcoudurier
parents:
diff changeset
1894 };
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1895
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1896 AVOutputFormat mxf_d10_muxer = {
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1897 "mxf_d10",
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1898 NULL_IF_CONFIG_SMALL("Material eXchange Format, D-10 Mapping"),
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1899 "application/mxf",
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1900 NULL,
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1901 sizeof(MXFContext),
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1902 CODEC_ID_PCM_S16LE,
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1903 CODEC_ID_MPEG2VIDEO,
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1904 mxf_write_header,
4504
c0803ee07a93 merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents: 4500
diff changeset
1905 mxf_write_packet,
4473
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1906 mxf_write_footer,
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1907 AVFMT_NOTIMESTAMPS,
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1908 NULL,
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1909 mxf_interleave,
9eedb6599102 MXF D-10 muxer
bcoudurier
parents: 4472
diff changeset
1910 };