* SMPTE RP224: Registry of SMPTE Universal Labels
*/
-//#define DEBUG
-
+#include <inttypes.h>
#include <math.h>
#include <time.h>
} MXFContainerEssenceEntry;
static const struct {
- enum CodecID id;
+ enum AVCodecID id;
int index;
} mxf_essence_mappings[] = {
- { CODEC_ID_MPEG2VIDEO, 0 },
- { CODEC_ID_PCM_S24LE, 1 },
- { CODEC_ID_PCM_S16LE, 1 },
- { CODEC_ID_NONE }
+ { AV_CODEC_ID_MPEG2VIDEO, 0 },
+ { AV_CODEC_ID_PCM_S24LE, 1 },
+ { AV_CODEC_ID_PCM_S16LE, 1 },
+ { AV_CODEC_ID_NONE }
};
static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st);
/*
* Get essence container ul index
*/
-static int mxf_get_essence_container_ul_index(enum CodecID id)
+static int mxf_get_essence_container_ul_index(enum AVCodecID id)
{
int i;
for (i = 0; mxf_essence_mappings[i].id; i++)
mxf_write_metadata_key(pb, 0x013000);
PRINT_KEY(s, "identification key", pb->buf_ptr - 16);
- version = s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT ?
+ version = s->flags & AVFMT_FLAG_BITEXACT ?
"0.0.0" : AV_STRINGIFY(LIBAVFORMAT_VERSION);
length = 84 + (strlen(company)+strlen(product)+strlen(version))*2; // utf-16
klv_encode_ber_length(pb, length);
}
}
-static void mxf_write_partition(AVFormatContext *s, int bodysid,
+static int mxf_write_partition(AVFormatContext *s, int bodysid,
int indexsid,
const uint8_t *key, int write_metadata)
{
int64_t header_byte_count_offset;
unsigned index_byte_count = 0;
uint64_t partition_offset = avio_tell(pb);
+ int err;
if (!mxf->edit_unit_byte_count && mxf->edit_units_count)
index_byte_count = 85 + 12+(s->nb_streams+1)*6 +
}
if (!memcmp(key, body_partition_key, 16)) {
- mxf->body_partition_offset =
- av_realloc(mxf->body_partition_offset,
- (mxf->body_partitions_count+1)*
- sizeof(*mxf->body_partition_offset));
+ if ((err = av_reallocp_array(&mxf->body_partition_offset, mxf->body_partitions_count + 1,
+ sizeof(*mxf->body_partition_offset))) < 0) {
+ mxf->body_partitions_count = 0;
+ return err;
+ }
mxf->body_partition_offset[mxf->body_partitions_count++] = partition_offset;
}
}
avio_flush(pb);
+
+ return 0;
}
static const UID mxf_mpeg2_codec_uls[] = {
av_log(s, AV_LOG_ERROR, "video stream must be first track\n");
return -1;
}
- if (fabs(av_q2d(st->codec->time_base) - 1/25.0) < 0.0001) {
+ // TODO: should be avg_frame_rate
+ if (fabs(av_q2d(st->time_base) - 1/25.0) < 0.0001) {
samples_per_frame = PAL_samples_per_frame;
mxf->time_base = (AVRational){ 1, 25 };
mxf->timecode_base = 25;
- } else if (fabs(av_q2d(st->codec->time_base) - 1001/30000.0) < 0.0001) {
+ } else if (fabs(av_q2d(st->time_base) - 1001/30000.0) < 0.0001) {
samples_per_frame = NTSC_samples_per_frame;
mxf->time_base = (AVRational){ 1001, 30000 };
mxf->timecode_base = 30;
av_log(s, AV_LOG_ERROR, "MXF D-10 only support one audio track\n");
return -1;
}
- if (st->codec->codec_id != CODEC_ID_PCM_S16LE &&
- st->codec->codec_id != CODEC_ID_PCM_S24LE) {
+ if (st->codec->codec_id != AV_CODEC_ID_PCM_S16LE &&
+ st->codec->codec_id != AV_CODEC_ID_PCM_S24LE) {
av_log(s, AV_LOG_ERROR, "MXF D-10 only support 16 or 24 bits le audio\n");
}
sc->index = ((MXFStreamContext*)s->streams[0]->priv_data)->index + 1;
mxf->essence_container_count = 1;
}
- if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT))
+ if (!(s->flags & AVFMT_FLAG_BITEXACT))
mxf_gen_umid(s);
for (i = 0; i < s->nb_streams; i++) {
static const uint8_t system_metadata_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x01,0x00 };
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 };
-static uint32_t ff_framenum_to_12m_time_code(unsigned frame, int drop, int fps)
+static uint32_t framenum_to_12m_time_code(unsigned frame, int drop, int fps)
{
return (0 << 31) | // color frame flag
(drop << 30) | // drop frame flag
avio_wb64(pb, 0); // creation date/time stamp
avio_w8(pb, 0x81); // SMPTE 12M time code
- time_code = ff_framenum_to_12m_time_code(frame, mxf->timecode_drop_frame, mxf->timecode_base);
+ time_code = framenum_to_12m_time_code(frame, mxf->timecode_drop_frame,
+ mxf->timecode_base);
avio_wb32(pb, time_code);
avio_wb32(pb, 0); // binary group data
avio_wb64(pb, 0);
while (samples < end) {
for (i = 0; i < st->codec->channels; i++) {
uint32_t sample;
- if (st->codec->codec_id == CODEC_ID_PCM_S24LE) {
+ if (st->codec->codec_id == AV_CODEC_ID_PCM_S24LE) {
sample = AV_RL24(samples)<< 4;
samples += 3;
} else {
AVStream *st = s->streams[pkt->stream_index];
MXFStreamContext *sc = st->priv_data;
MXFIndexEntry ie = {0};
+ int err;
if (!mxf->edit_unit_byte_count && !(mxf->edit_units_count % EDIT_UNITS_PER_BODY)) {
- mxf->index_entries = av_realloc(mxf->index_entries,
- (mxf->edit_units_count + EDIT_UNITS_PER_BODY)*sizeof(*mxf->index_entries));
- if (!mxf->index_entries) {
+ if ((err = av_reallocp_array(&mxf->index_entries, mxf->edit_units_count
+ + EDIT_UNITS_PER_BODY, sizeof(*mxf->index_entries))) < 0) {
+ mxf->edit_units_count = 0;
av_log(s, AV_LOG_ERROR, "could not allocate index entries\n");
- return -1;
+ return err;
}
}
- if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO) {
+ if (st->codec->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
if (!mxf_parse_mpeg2_frame(s, st, pkt, &ie)) {
av_log(s, AV_LOG_ERROR, "could not get mpeg2 profile and level\n");
return -1;
if (!mxf->header_written) {
if (mxf->edit_unit_byte_count) {
- mxf_write_partition(s, 1, 2, header_open_partition_key, 1);
+ if ((err = mxf_write_partition(s, 1, 2, header_open_partition_key, 1)) < 0)
+ return err;
mxf_write_klv_fill(s);
mxf_write_index_table_segment(s);
} else {
- mxf_write_partition(s, 0, 0, header_open_partition_key, 1);
+ if ((err = mxf_write_partition(s, 0, 0, header_open_partition_key, 1)) < 0)
+ return err;
}
mxf->header_written = 1;
}
(!mxf->edit_units_count || mxf->edit_units_count > EDIT_UNITS_PER_BODY) &&
!(ie.flags & 0x33)) { // I frame, Gop start
mxf_write_klv_fill(s);
- mxf_write_partition(s, 1, 2, body_partition_key, 0);
-
+ if ((err = mxf_write_partition(s, 1, 2, body_partition_key, 0)) < 0)
+ return err;
mxf_write_klv_fill(s);
mxf_write_index_table_segment(s);
}
{
MXFContext *mxf = s->priv_data;
AVIOContext *pb = s->pb;
+ int err;
mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count;
mxf_write_klv_fill(s);
mxf->footer_partition_offset = avio_tell(pb);
if (mxf->edit_unit_byte_count) { // no need to repeat index
- mxf_write_partition(s, 0, 0, footer_partition_key, 0);
+ if ((err = mxf_write_partition(s, 0, 0, footer_partition_key, 0)) < 0)
+ return err;
} else {
- mxf_write_partition(s, 0, 2, footer_partition_key, 0);
-
+ if ((err = mxf_write_partition(s, 0, 2, footer_partition_key, 0)) < 0)
+ return err;
mxf_write_klv_fill(s);
mxf_write_index_table_segment(s);
}
if (s->pb->seekable) {
avio_seek(pb, 0, SEEK_SET);
if (mxf->edit_unit_byte_count) {
- mxf_write_partition(s, 1, 2, header_closed_partition_key, 1);
+ if ((err = mxf_write_partition(s, 1, 2, header_closed_partition_key, 1)) < 0)
+ return err;
mxf_write_klv_fill(s);
mxf_write_index_table_segment(s);
} else {
- mxf_write_partition(s, 0, 0, header_closed_partition_key, 1);
+ if ((err = mxf_write_partition(s, 0, 0, header_closed_partition_key, 1)) < 0)
+ return err;
}
}
- avio_flush(pb);
-
ff_audio_interleave_close(s);
av_freep(&mxf->index_entries);
}
*out = pktl->pkt;
- //av_log(s, AV_LOG_DEBUG, "out st:%d dts:%lld\n", (*out).stream_index, (*out).dts);
+ av_dlog(s, "out st:%d dts:%"PRId64"\n", (*out).stream_index, (*out).dts);
s->packet_buffer = pktl->next;
if(s->streams[pktl->pkt.stream_index]->last_in_packet_buffer == pktl)
s->streams[pktl->pkt.stream_index]->last_in_packet_buffer= NULL;
.mime_type = "application/mxf",
.extensions = "mxf",
.priv_data_size = sizeof(MXFContext),
- .audio_codec = CODEC_ID_PCM_S16LE,
- .video_codec = CODEC_ID_MPEG2VIDEO,
+ .audio_codec = AV_CODEC_ID_PCM_S16LE,
+ .video_codec = AV_CODEC_ID_MPEG2VIDEO,
.write_header = mxf_write_header,
.write_packet = mxf_write_packet,
.write_trailer = mxf_write_footer,
.long_name = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format) D-10 Mapping"),
.mime_type = "application/mxf",
.priv_data_size = sizeof(MXFContext),
- .audio_codec = CODEC_ID_PCM_S16LE,
- .video_codec = CODEC_ID_MPEG2VIDEO,
+ .audio_codec = AV_CODEC_ID_PCM_S16LE,
+ .video_codec = AV_CODEC_ID_MPEG2VIDEO,
.write_header = mxf_write_header,
.write_packet = mxf_write_packet,
.write_trailer = mxf_write_footer,