[FFmpeg-soc] MXF muxer version 0.0.4
Michael Niedermayer
michaelni at gmx.at
Fri Aug 22 19:30:20 CEST 2008
On Fri, Aug 22, 2008 at 08:39:28PM +0800, zhentan feng wrote:
> Hi
>
> 2008/8/22 Michael Niedermayer <michaelni at gmx.at>
> [...]
>
> > [...]
> > > > > +static void mxf_write_package(AVFormatContext *s, enum
> > > > MXFMetadataSetType type)
> > > > > +{
> > > > > + ByteIOContext *pb = s->pb;
> > > > > + int i;
> > > > > +
> > > > > + if (type == MaterialPackage) {
> > > > > + mxf_write_metadata_key(pb, 0x013600);
> > > > > + PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16);
> > > > > + klv_encode_ber_length(pb, 92 + 16 * s->nb_streams);
> > > > > + }
> > > > > + else {
> > > > > + mxf_write_metadata_key(pb, 0x013700);
> > > > > + PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16);
> > > > > + klv_encode_ber_length(pb, 112 + 16 * s->nb_streams); // 20
> > bytes
> > > > length for descriptor reference
> > > > > + }
> > > > > +
> > > > > + // write uid
> > > > > + mxf_write_local_tag(pb, 16, 0x3C0A);
> > > > > + mxf_write_uuid(pb, type, 0);
> > > > > + av_log(s,AV_LOG_DEBUG, "package type:%d\n", type);
> > > > > + PRINT_KEY(s, "package uid", pb->buf_ptr - 16);
> > > > > +
> > > > > + // write package umid
> > > > > + mxf_write_local_tag(pb, 32, 0x4401);
> > > > > + mxf_write_umid(pb, type, 0);
> > > > > + PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16);
> > > > > + // write create date
> > > > > + mxf_write_local_tag(pb, 8, 0x4405);
> > > > > + put_be64(pb, 0);
> > > > > +
> > > > > + // write modified date
> > > > > + mxf_write_local_tag(pb, 8, 0x4404);
> > > > > + put_be64(pb, 0);
> > > > > +
> > > > > + // write track refs
> > > > > + mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x4403);
> > > > > + mxf_write_refs_count(pb, s->nb_streams);
> > > >
> > > > > + for (i = 0; i < s->nb_streams; i++)
> > > > > + mxf_write_uuid(pb, type == MaterialPackage ? Track : Track +
> > > > 0xf0, i);
> > > >
> > > > a Track2 or any other name would be cleaner than Track + 0xf0
> > > >
> > >
> > > do you mean add a new enum type for the other track?
> > > if there many tracks, it will add Track2, Track3...
> > >
> > > so,
> > > mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + 0xf0 + i,
> > i);
> > > is this ok?
> >
> > no
> >
> >
> > > 0xf0 just like a offset.
> >
> > 0xf0 is the problem
> > It should be an enum like
> >
> > mxf_write_uuid(pb, type == MaterialPackage ? Track : SomethingElse, i);
> >
> > Track + 0xf0 can be equal to another enum, its not likely but its just not
> > correct to add random integers to an enum to create a new one.
> >
>
> here is the new patch of version 0.0.6.
> I add a TypeBottom value at the end of MXFMetadataType, so when add new
> type, TypeBottom is always at the bottom acting as a bottom line, so it
> would be not conflict.
>
> see attached patch.
> thanks
>
> --
> Best wishes~
> Index: mxfenc.c
> ===================================================================
> --- mxfenc.c (revision 14903)
> +++ mxfenc.c (working copy)
> @@ -245,6 +245,43 @@
> return uls;
> }
>
> +static int mxf_write_essence_container_refs(AVFormatContext *s, int write)
> +{
> + MXFContext *mxf = s->priv_data;
unused
> + ByteIOContext *pb = s->pb;
> + AVStream *st;
> + int i, count = 0, j = 0;
> + int essence_container_ul_sign[32] = { 0 };
the size 32, could be too small when more entries are added to
ff_mxf_essence_container_uls and there are more than 32 streams.
[...]
> @@ -352,6 +389,108 @@
> mxf_write_uuid(pb, SourcePackage, 0);
> }
>
> +static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
> +{
> + ByteIOContext *pb = s->pb;
> + int i;
> +
> + if (type == MaterialPackage) {
> + mxf_write_metadata_key(pb, 0x013600);
> + PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16);
> + klv_encode_ber_length(pb, 92 + 16 * s->nb_streams);
> + }
> + else {
> + mxf_write_metadata_key(pb, 0x013700);
> + PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16);
> + klv_encode_ber_length(pb, 112 + 16 * s->nb_streams); // 20 bytes length for descriptor reference
> + }
> +
> + // write uid
> + mxf_write_local_tag(pb, 16, 0x3C0A);
> + mxf_write_uuid(pb, type, 0);
> + av_log(s,AV_LOG_DEBUG, "package type:%d\n", type);
> + PRINT_KEY(s, "package uid", pb->buf_ptr - 16);
> +
> + // write package umid
> + mxf_write_local_tag(pb, 32, 0x4401);
> + mxf_write_umid(pb, type, 0);
> + PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16);
> + // write create date
> + mxf_write_local_tag(pb, 8, 0x4405);
> + put_be64(pb, 0);
> +
> + // write modified date
> + mxf_write_local_tag(pb, 8, 0x4404);
> + put_be64(pb, 0);
> +
> + // write track refs
> + mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x4403);
> + mxf_write_refs_count(pb, s->nb_streams);
> + for (i = 0; i < s->nb_streams; i++)
> + mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i);
> +
> + if (type == SourcePackage) {
> + // write multiple descriptor reference
> + mxf_write_local_tag(pb, 16, 0x4701);
> + mxf_write_uuid(pb, MultipleDescriptor, 0);
> + }
> +}
> +
> +static void mxf_write_track(AVFormatContext *s, int stream_index, enum MXFMetadataSetType type, int *track_number_sign)
> +{
> + ByteIOContext *pb = s->pb;
> + AVStream *st;
> + MXFStreamContext *sc;
> + const MXFCodecUL *element;
> + int i = 0;
> +
> + mxf_write_metadata_key(pb, 0x013b00);
> + PRINT_KEY(s, "track key", pb->buf_ptr - 16);
> + klv_encode_ber_length(pb, 80);
> +
> + st = s->streams[stream_index];
> + sc = st->priv_data;
> +
> + // write track uid
> + mxf_write_local_tag(pb, 16, 0x3C0A);
> + mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, stream_index);
> + PRINT_KEY(s, "track uid", pb->buf_ptr - 16);
> + // write track id
> + mxf_write_local_tag(pb, 4, 0x4801);
> + put_be32(pb, stream_index);
> +
> + mxf_write_local_tag(pb, 4, 0x4804);
> + if (type != MaterialPackage) {
> + for (element = mxf_essence_element_key; element->id != CODEC_ID_NONE; element++) {
> + if (st->codec->codec_id== element->id) {
> + // set essence_element key
> + memcpy(sc->track_essence_element_key, element->uid, 16);
> + sc->track_essence_element_key[15] += track_number_sign[i];
> + // write track number
> + put_buffer(pb, sc->track_essence_element_key + 12, 4);
> +
> + track_number_sign[i] ++;
> + break;
> + }
> + i++;
> + }
> + } else {
> + put_be32(pb, 0); // track number of material package is 0
> + }
> +
> + mxf_write_local_tag(pb, 8, 0x4B01);
> + put_be32(pb, st->time_base.den);
> + put_be32(pb, st->time_base.num);
> +
> + // write origin
> + mxf_write_local_tag(pb, 8, 0x4B02);
> + put_be64(pb, 0);
> +
> + // write sequence refs
> + mxf_write_local_tag(pb, 16, 0x4803);
> + mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, stream_index);
> +}
> +
> static void mxf_write_common_fields( ByteIOContext *pb, AVStream *st)
> {
> const MXFDataDefinitionUL * data_def_ul;
ok
> @@ -366,20 +505,69 @@
> put_be64(pb, st->duration);
> }
>
> -static int mux_write_packet(AVFormatContext *s, AVPacket *pkt)
> -{
> - ByteIOContext *pb = s->pb;
> - AVStream *st = s->streams[pkt->stream_index];
> - MXFStreamContext *sc = st->priv_data;
> -
> - put_buffer(pb, sc->track_essence_element_key, 16); // write key
> - klv_encode_ber_length(pb, pkt->size); // write length
> - put_buffer(pb, pkt->data, pkt->size); // write value
> -
> - put_flush_packet(pb);
> - return 0;
> -}
> +static void mxf_write_sequence(AVFormatContext *s, int stream_index, enum MXFMetadataSetType type)
> +{
> + ByteIOContext *pb = s->pb;
> + AVStream *st;
> +
> + mxf_write_metadata_key(pb, 0x010f00);
> + PRINT_KEY(s, "sequence key", pb->buf_ptr - 16);
> + klv_encode_ber_length(pb, 80);
> +
> + st = s->streams[stream_index];
> +
> + mxf_write_local_tag(pb, 16, 0x3C0A);
> + mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, stream_index);
> +
> + PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16);
> + mxf_write_common_fields(pb, st);
> +
> + // write structural component
> + mxf_write_local_tag(pb, 16 + 8, 0x1001);
> + mxf_write_refs_count(pb, 1);
> + mxf_write_uuid(pb, type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, stream_index);
> +}
>
> +static void mxf_write_structural_component(AVFormatContext *s, int stream_index, enum MXFMetadataSetType type)
> +{
> + ByteIOContext *pb = s->pb;
> + AVStream *st;
> + int i;
> +
> + mxf_write_metadata_key(pb, 0x011100);
> + PRINT_KEY(s, "sturctural component key", pb->buf_ptr - 16);
> + klv_encode_ber_length(pb, 108);
> +
> + st = s->streams[stream_index];
> +
> + // write uid
> + mxf_write_local_tag(pb, 16, 0x3C0A);
> + mxf_write_uuid(pb, type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, stream_index);
> +
> + PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16);
> + mxf_write_common_fields(pb, st);
> +
> + // write start_position
> + mxf_write_local_tag(pb, 8, 0x1201);
> + put_be64(pb, 0);
> +
> + mxf_write_local_tag(pb, 32, 0x1101);
> + if (type == SourcePackage) {
> + // write source package uid, end of the reference
> + for (i = 0; i < 4; i++) {
> + put_be64(pb, 0);
> + }
> + } else
> + mxf_write_umid(pb, SourcePackage, 0);
> +
> + mxf_write_local_tag(pb, 4, 0x1102);
> + if (type == SourcePackage)
> + // write source track id
> + put_be32(pb, 0);
> + else
> + put_be32(pb, stream_index);
> +}
> +
> static void mxf_write_multi_descriptor(AVFormatContext *s)
> {
> ByteIOContext *pb = s->pb;
> @@ -541,6 +729,46 @@
> return 0;
> }
>
> +static void mxf_write_partition(AVFormatContext *s, int64_t byte_position, int bodysid, const uint8_t *key)
> +{
> + MXFContext *mxf = s->priv_data;
> + ByteIOContext *pb = s->pb;
> + // write klv
> + put_buffer(pb, key, 16);
> + if (!mxf->essence_container_count)
> + mxf->essence_container_count = mxf_write_essence_container_refs(s, 0);
> + klv_encode_ber_length(pb, 88 + 16 * mxf->essence_container_count);
> +
> + // write partition value
> + put_be16(pb, 1); // majorVersion
> + put_be16(pb, 2); // minorVersion
> + put_be32(pb, 1); // kagSize
> +
> + put_be64(pb, byte_position); // thisPartition
> + put_be64(pb, 0); // previousPartition
> +
> + // set offset
> + if (!byte_position)
> + mxf->header_footer_partition_offset = url_ftell(pb);
> + put_be64(pb, byte_position); // footerPartition,update later
> +
> + // set offset
> + if (!byte_position)
> + mxf->header_byte_count_offset = url_ftell(pb);
> + put_be64(pb, 0); // headerByteCount, update later
> +
> + // no indexTable
> + put_be64(pb, 0); // indexByteCount
> + put_be32(pb, 0); // indexSID
> + put_be64(pb, 0); // bodyOffset
> +
> + put_be32(pb, bodysid); // bodySID
> + put_buffer(pb, op1a_ul, 16); // operational pattern
> +
> + // essence container
> + mxf_write_essence_container_refs(s, 1);
> +}
> +
> static int mux_write_header(AVFormatContext *s)
> {
> MXFContext *mxf = s->priv_data;
ok
[...]
> static void mxf_update_header_partition(AVFormatContext *s, int64_t footer_partition_offset)
> {
> MXFContext *mxf = s->priv_data;
> Index: mxf.h
> ===================================================================
> --- mxf.h (revision 14903)
> +++ mxf.h (working copy)
> @@ -41,6 +41,7 @@
> Identification,
> ContentStorage,
> SubDescriptor,
> + TypeBottom,// add metadata type before this
> };
>
> typedef struct {
ok
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Democracy is the form of government in which you can choose your dictator
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-soc/attachments/20080822/022a02a1/attachment.pgp>
More information about the FFmpeg-soc
mailing list