#include "libavutil/mathematics.h"
#include "libavcodec/bytestream.h"
#include "libavutil/intreadwrite.h"
+#include "libavutil/parseutils.h"
#include "libavutil/timecode.h"
#include "avformat.h"
#include "internal.h"
}
}
- /* TODO: handle multiple source clips */
+ /* TODO: handle multiple source clips, only finds first valid source clip */
+ if(material_track->sequence->structural_components_count > 1)
+ av_log(mxf->fc, AV_LOG_WARNING, "material track %d: has %d components\n",
+ material_track->track_id, material_track->sequence->structural_components_count);
+
for (j = 0; j < material_track->sequence->structural_components_count; j++) {
component = mxf_resolve_sourceclip(mxf, &material_track->sequence->structural_components_refs[j]);
if (!component)
av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source track found\n", material_track->track_id);
break;
}
+ if(source_track && component)
+ break;
}
if (!source_track || !component || !source_package)
continue;
return ret;
}
-static int mxf_timestamp_to_str(uint64_t timestamp, char **str)
+static int64_t mxf_timestamp_to_int64(uint64_t timestamp)
{
struct tm time = { 0 };
time.tm_year = (timestamp >> 48) - 1900;
time.tm_min = av_clip(time.tm_min, 0, 59);
time.tm_sec = av_clip(time.tm_sec, 0, 59);
- *str = av_mallocz(32);
- if (!*str)
- return AVERROR(ENOMEM);
- if (!strftime(*str, 32, "%Y-%m-%d %H:%M:%S", &time))
- (*str)[0] = '\0';
-
- return 0;
+ return (int64_t)av_timegm(&time) * 1000000;
}
#define SET_STR_METADATA(pb, name, str) do { \
#define SET_TS_METADATA(pb, name, var, str) do { \
var = avio_rb64(pb); \
- if ((ret = mxf_timestamp_to_str(var, &str)) < 0) \
+ if ((ret = avpriv_dict_set_timestamp(&s->metadata, name, mxf_timestamp_to_int64(var)) < 0)) \
return ret; \
- av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
} while (0)
static int mxf_read_identification_metadata(void *arg, AVIOContext *pb, int tag, int size, UID _uid, int64_t klv_offset)