mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-30 11:24:17 +00:00
libavformat/mxfdec: export track name metadata
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
e3196b6862
commit
3b82be9e3b
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user