-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathD10MXFOP1AWriter.h
195 lines (156 loc) · 6.83 KB
/
D10MXFOP1AWriter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/*
* D10 MXF OP-1A writer
*
* Copyright (C) 2010, British Broadcasting Corporation
* All Rights Reserved.
*
* Author: Philip de Nier
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the British Broadcasting Corporation nor the names
* of its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __D10_MXF_OP1A_WRITER_H__
#define __D10_MXF_OP1A_WRITER_H__
#include <string>
#include <vector>
#include <queue>
#include <libMXF++/MXF.h>
#include "D10ContentPackage.h"
class SetWithDuration;
class D10MXFOP1AWriter
{
public:
typedef enum
{
D10_BIT_RATE_30,
D10_BIT_RATE_40,
D10_BIT_RATE_50
} D10BitRate;
typedef enum
{
D10_SAMPLE_RATE_625_50I,
D10_SAMPLE_RATE_525_60I,
} D10SampleRate;
public:
static uint32_t GetContentPackageSize(D10SampleRate sample_rate, uint32_t encoded_picture_size);
public:
D10MXFOP1AWriter();
~D10MXFOP1AWriter();
// configure and create file
void SetSampleRate(D10SampleRate sample_rate); // default D10_SAMPLE_RATE_625_50I
void SetAudioChannelCount(uint32_t count); // default is 4
void SetAudioQuantizationBits(uint32_t bits); // default is 24; alternative is 16
void SetAudioSequenceOffset(uint8_t offset); // default determined from input
void SetAspectRatio(mxfRational aspect_ratio); // default is 16:9; alternative is 4:3
void SetStartTimecode(int64_t count, bool drop_frame); // default 0, false
void SetBitRate(D10BitRate rate, uint32_t encoded_picture_size); // default D10_BIT_RATE_50, 250000
void SetMaterialPackageUID(mxfUMID uid); // default generated
void SetFileSourcePackageUID(mxfUMID uid); // default generated
void SetProductInfo(std::string company_name, std::string product_name, std::string version, mxfUUID product_uid);
// default see source
mxfpp::DataModel* CreateDataModel();
mxfpp::HeaderMetadata* CreateHeaderMetadata();
void ReserveHeaderMetadataSpace(uint32_t min_bytes);
bool CreateFile(std::string filename);
bool CreateFile(mxfpp::File **file);
// write content package data
// user timecode written to the system item in the essence container
void SetUserTimecode(Timecode user_timecode);
// timecode calculated from the start timecode and duration
Timecode GenerateUserTimecode();
// MPEG video data
void SetVideo(const unsigned char *data, uint32_t size);
// PCM audio data
// the number of audio samples must follow the 5-sequence count 1602, 1601, 1602, 1601, 1602 when
// the sample rate is 60i
uint32_t GetAudioSampleCount();
void SetAudio(uint32_t channel, const unsigned char *data, uint32_t size);
void WriteContentPackage();
void WriteContentPackage(const D10ContentPackage *content_package);
// file info
mxfpp::HeaderMetadata* GetHeaderMetadata() const { return mHeaderMetadata; }
mxfpp::DataModel* GetDataModel() const { return mDataModel; }
int64_t GetDuration() const { return mDuration; }
int64_t GetFileSize() const;
mxfUMID GetMaterialPackageUID() const { return mMaterialPackageUID; }
mxfUMID GetFileSourcePackageUID() const { return mFileSourcePackageUID; }
uint32_t GetStoredWidth() const;
uint32_t GetStoredHeight() const;
// optional update of header metadata and complete writing file
void UpdateStartTimecode(int64_t count);
void CompleteFile();
private:
void CreateFile();
uint32_t WriteSystemItem(const D10ContentPackage *content_package);
void InitAES3Block(DynamicByteArray *aes3_block, uint8_t sequence_index);
void UpdateAES3Blocks(const D10ContentPackage *content_package);
void FinalUpdateAES3Blocks();
uint8_t GetAudioSequenceOffset(const D10ContentPackage *next_content_package);
private:
D10SampleRate mSampleRate;
mxfRational mVideoSampleRate;
uint16_t mRoundedTimecodeBase;
uint32_t mChannelCount;
uint32_t mAudioQuantizationBits;
uint32_t mAudioBytesPerSample;
uint8_t mAudioSequenceOffset;
mxfRational mAspectRatio;
int64_t mStartTimecode;
bool mDropFrameTimecode;
D10BitRate mD10BitRate;
uint32_t mEncodedImageSize;
uint32_t mMaxEncodedImageSize;
uint32_t mReserveMinBytes;
std::string mCompanyName;
std::string mProductName;
std::string mVersionString;
mxfUUID mProductUID;
uint32_t mSystemItemSize;
uint32_t mVideoItemSize;
uint32_t mAudioItemSize;
mxfUL mEssenceContainerUL;
mxfUMID mMaterialPackageUID;
mxfUMID mFileSourcePackageUID;
mxfpp::File *mMXFFile;
mxfpp::DataModel *mDataModel;
mxfpp::HeaderMetadata *mHeaderMetadata;
mxfpp::IndexTableSegment *mIndexSegment;
mxfpp::Partition *mHeaderPartition;
int64_t mHeaderMetadataStartPos;
int64_t mHeaderMetadataEndPos;
std::vector<SetWithDuration*> mSetsWithDuration;
mxfpp::TimecodeComponent *mMaterialPackageTC;
mxfpp::TimecodeComponent *mFilePackageTC;
D10ContentPackageInt *mContentPackage;
std::queue<DynamicByteArray*> mAES3Blocks;
uint32_t mAudioSequence[5];
uint8_t mAudioSequenceCount;
uint8_t mAudioSequenceIndex;
uint32_t mMinAudioSamples;
uint32_t mMaxAudioSamples;
uint32_t mMaxFinalPaddingSamples;
std::vector<D10ContentPackage*> mBufferedContentPackages;
int64_t mDuration;
};
#endif