Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Reid <mindmark@gmail.com>2016-09-21 23:42:06 +0300
committerMichael Niedermayer <michael@niedermayer.cc>2016-10-21 03:04:01 +0300
commit3b82be9e3b7ecd5a95469efbaae3dff61dd42a8a (patch)
tree56db8b5fd48a8f84ee2c27d01d7ece91d16360d8 /libavformat
parente3196b686233bed3009248cb1ab7f0628ede6a2f (diff)
libavformat/mxfdec: export track name metadata
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/mxfdec.c79
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);