diff options
author | Mark Reid <mindmark@gmail.com> | 2016-09-21 13:42:06 -0700 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-10-21 02:04:01 +0200 |
commit | 3b82be9e3b7ecd5a95469efbaae3dff61dd42a8a (patch) | |
tree | 56db8b5fd48a8f84ee2c27d01d7ece91d16360d8 /libavformat | |
parent | e3196b686233bed3009248cb1ab7f0628ede6a2f (diff) | |
download | ffmpeg-3b82be9e3b7ecd5a95469efbaae3dff61dd42a8a.tar.gz |
libavformat/mxfdec: export track name metadata
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/mxfdec.c | 79 |
1 files changed, 44 insertions, 35 deletions
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 8332362ccf..c73a9c0c32 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -155,6 +155,7 @@ typedef struct { MXFSequence *sequence; /* mandatory, and only one */ UID sequence_ref; int track_id; + char *name; uint8_t track_number[4]; AVRational edit_rate; int intra_only; @@ -328,6 +329,9 @@ static void mxf_free_metadataset(MXFMetadataSet **ctx, int freectx) av_freep(&((MXFTaggedValue *)*ctx)->name); av_freep(&((MXFTaggedValue *)*ctx)->value); break; + case Track: + av_freep(&((MXFTrack *)*ctx)->name); + break; case IndexTableSegment: seg = (MXFIndexTableSegment *)*ctx; av_freep(&seg->temporal_offset_entries); @@ -707,6 +711,41 @@ static int mxf_read_strong_ref_array(AVIOContext *pb, UID **refs, int *count) return 0; } +static inline int mxf_read_utf16_string(AVIOContext *pb, int size, char** str, int be) +{ + int ret; + size_t buf_size; + + if (size < 0) + return AVERROR(EINVAL); + + buf_size = size + size / 2 + 1; + *str = av_malloc(buf_size); + if (!*str) + return AVERROR(ENOMEM); + + if (be) + ret = avio_get_str16be(pb, size, *str, buf_size); + else + ret = avio_get_str16le(pb, size, *str, buf_size); + + if (ret < 0) { + av_freep(str); + return ret; + } + + return ret; +} + +#define READ_STR16(type, big_endian) \ +static int mxf_read_utf16 ## type ##_string(AVIOContext *pb, int size, char** str) \ +{ \ +return mxf_read_utf16_string(pb, size, str, big_endian); \ +} +READ_STR16(be, 1) +READ_STR16(le, 0) +#undef READ_STR16 + static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset) { MXFContext *mxf = arg; @@ -780,6 +819,9 @@ static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid case 0x4804: avio_read(pb, track->track_number, 4); break; + case 0x4802: + mxf_read_utf16be_string(pb, size, &track->name); + break; case 0x4b01: track->edit_rate.num = avio_rb32(pb); track->edit_rate.den = avio_rb32(pb); @@ -825,41 +867,6 @@ static int mxf_read_essence_group(void *arg, AVIOContext *pb, int tag, int size, return 0; } -static inline int mxf_read_utf16_string(AVIOContext *pb, int size, char** str, int be) -{ - int ret; - size_t buf_size; - - if (size < 0) - return AVERROR(EINVAL); - - buf_size = size + size / 2 + 1; - *str = av_malloc(buf_size); - if (!*str) - return AVERROR(ENOMEM); - - if (be) - ret = avio_get_str16be(pb, size, *str, buf_size); - else - ret = avio_get_str16le(pb, size, *str, buf_size); - - if (ret < 0) { - av_freep(str); - return ret; - } - - return ret; -} - -#define READ_STR16(type, big_endian) \ -static int mxf_read_utf16 ## type ##_string(AVIOContext *pb, int size, char** str) \ -{ \ -return mxf_read_utf16_string(pb, size, str, big_endian); \ -} -READ_STR16(be, 1) -READ_STR16(le, 0) -#undef READ_STR16 - static int mxf_read_package(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset) { MXFPackage *package = arg; @@ -2038,6 +2045,8 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) mxf_add_umid_metadata(&st->metadata, "file_package_umid", source_package); if (source_package->name && source_package->name[0]) av_dict_set(&st->metadata, "file_package_name", source_package->name, 0); + if (material_track->name && material_track->name[0]) + av_dict_set(&st->metadata, "track_name", material_track->name, 0); mxf_parse_physical_source_package(mxf, source_track, st); |