From cedebde15adf210a0dd301830776fec1f4ca387a Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Tue, 26 Aug 2008 15:58:25 +0000 Subject: [PATCH] Remaining parts of GSoC MXF muxer by Zhentan Feng. Originally committed as revision 14975 to svn://svn.ffmpeg.org/ffmpeg/trunk --- Changelog | 1 + libavformat/Makefile | 1 + libavformat/allformats.c | 2 +- libavformat/mxf.h | 2 +- libavformat/mxfenc.c | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/Changelog b/Changelog index 373394eb38..f049c02b7e 100644 --- a/Changelog +++ b/Changelog @@ -132,6 +132,7 @@ version - Apple Lossless Audio Codec (ALAC) encoder - AAC decoder - floating point PCM encoder/decoder +- MXF muxer version 0.4.9-pre1: diff --git a/libavformat/Makefile b/libavformat/Makefile index 8db975e129..6457f6650a 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -109,6 +109,7 @@ OBJS-$(CONFIG_MSNWC_TCP_DEMUXER) += msnwc_tcp.o OBJS-$(CONFIG_MTV_DEMUXER) += mtv.o OBJS-$(CONFIG_MVI_DEMUXER) += mvi.o OBJS-$(CONFIG_MXF_DEMUXER) += mxfdec.o mxf.o +OBJS-$(CONFIG_MXF_MUXER) += mxfenc.o mxf.o OBJS-$(CONFIG_NSV_DEMUXER) += nsvdec.o OBJS-$(CONFIG_NULL_MUXER) += raw.o OBJS-$(CONFIG_NUT_DEMUXER) += nutdec.o nut.o riff.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index bb15212bd8..d207c3b7f1 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -124,7 +124,7 @@ void av_register_all(void) REGISTER_DEMUXER (MSNWC_TCP, msnwc_tcp); REGISTER_DEMUXER (MTV, mtv); REGISTER_DEMUXER (MVI, mvi); - REGISTER_DEMUXER (MXF, mxf); + REGISTER_MUXDEMUX (MXF, mxf); REGISTER_DEMUXER (NSV, nsv); REGISTER_MUXER (NULL, null); REGISTER_MUXDEMUX (NUT, nut); diff --git a/libavformat/mxf.h b/libavformat/mxf.h index b6ba22ada4..9d9d0360ca 100644 --- a/libavformat/mxf.h +++ b/libavformat/mxf.h @@ -63,7 +63,7 @@ typedef struct { extern const MXFDataDefinitionUL ff_mxf_data_definition_uls[]; extern const MXFCodecUL ff_mxf_codec_uls[]; -extern const MXFCodecUL ff_mxf_essence_container_uls[]; +extern const MXFCodecUL ff_mxf_essence_container_uls[6]; #ifdef DEBUG #define PRINT_KEY(pc, s, x) dprintf(pc, "%s %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", s, \ diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 08f80523d8..3bcd6a34c4 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -245,6 +245,42 @@ static const MXFDataDefinitionUL *mxf_get_data_definition_ul(enum CodecType type return uls; } +static int mxf_write_essence_container_refs(AVFormatContext *s, int write) +{ + ByteIOContext *pb = s->pb; + AVStream *st; + int i, count = 0, j = 0; + const MXFCodecUL *codec_ul; + int essence_container_ul_sign[sizeof(ff_mxf_essence_container_uls) / sizeof(MXFCodecUL)] = { 0 }; + + for (codec_ul = ff_mxf_essence_container_uls; codec_ul->id; codec_ul++) { + for (i = 0; i < s->nb_streams; i++) { + st = s->streams[i]; + if (st->codec->codec_id == codec_ul->id) { + essence_container_ul_sign[count] = j; + count++; + break; + } + } + j++; + // considering WAV/AES3 frame wrapped, when get the first CODEC_ID_PCM_S16LE, break; + // this is a temporary method, when we can get more information, modofy this. + if (codec_ul->id == CODEC_ID_PCM_S16LE) + break; + } + + if (write) { + mxf_write_refs_count(pb, count); + for (i = 0; i < count; i++) { + put_buffer(pb, ff_mxf_essence_container_uls[essence_container_ul_sign[i]].uid, 16); + } + av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", count); + for (i = 0; i < count; i++) + PRINT_KEY(s, "essence container ul:\n", ff_mxf_essence_container_uls[essence_container_ul_sign[i]].uid); + } + return count; +} + static void mxf_write_preface(AVFormatContext *s) { MXFContext *mxf = s->priv_data;