[FFmpeg-devel] [PATCH 4/6] lavf/mxfdec: interpret interlaced j2k sample rate as field rate for some applications
Matthieu Bouron
matthieu.bouron at gmail.com
Wed Jul 22 15:29:45 CEST 2015
Sample rate should be interpreted as field rate for the files generated
by SAMMA and Canopus systems.
---
libavformat/mxfdec.c | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index 90abea5..e9e4ab9 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -47,6 +47,7 @@
#include "libavutil/aes.h"
#include "libavutil/avassert.h"
+#include "libavutil/avstring.h"
#include "libavutil/mathematics.h"
#include "libavcodec/bytestream.h"
#include "libavutil/intreadwrite.h"
@@ -298,6 +299,8 @@ static const uint8_t mxf_indirect_value_utf16be[] = { 0x42,0x01,0x10,0x
#define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))
+static const char *j2ki_field_rate_companies[] = { "Canopus", "SAMMA" };
+
static void mxf_free_metadataset(MXFMetadataSet **ctx, int freectx)
{
MXFIndexTableSegment *seg;
@@ -1800,6 +1803,7 @@ static int mxf_parse_physical_source_package(MXFContext *mxf, MXFTrack *source_t
static int mxf_parse_structural_metadata(MXFContext *mxf)
{
+ AVFormatContext *s = mxf->fc;
MXFPackage *material_package = NULL;
int i, j, k, ret;
@@ -2042,7 +2046,9 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
descriptor->frame_layout == SeparateFields) {
const char *buf;
const char* fdstr[] = { "tff", "bff" };
+ int l, field_rate = 0;
int layout = descriptor->frame_layout;
+ AVDictionaryEntry *entry = av_dict_get(s->metadata, "company_name", NULL, 0);
buf = layout == SegmentedFrame ? "segmented_frame" : "separate_fields";
av_dict_set(&st->metadata, "mxf_frame_layout", buf, 0);
@@ -2058,8 +2064,22 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
av_dict_set(&st->metadata, "mxf_field_dominance", buf, 0);
av_log(mxf->fc, AV_LOG_INFO, "Use filtergraph setfield=mode=%s,tinterlace to get full frames\n", buf);
- st->codec->time_base = st->time_base;
- st->time_base = (AVRational) { st->time_base.num, st->time_base.den * 2};
+ if (entry) {
+ for (l = 0; l < FF_ARRAY_ELEMS(j2ki_field_rate_companies); l++) {
+ if (av_stristr(entry->value, j2ki_field_rate_companies[l])) {
+ av_log(s, AV_LOG_INFO, "J2ki sample rate will be interpreted as field rate for company: %s\n", entry->value);
+ field_rate = 1;
+ break;
+ }
+ }
+ }
+
+ if (field_rate) {
+ st->codec->time_base = (AVRational) { st->time_base.num, st->time_base.den / 2 };
+ } else {
+ st->codec->time_base = st->time_base;
+ st->time_base = (AVRational) { st->time_base.num, st->time_base.den * 2};
+ }
}
break;
case AV_CODEC_ID_RAWVIDEO:
--
2.4.6
More information about the ffmpeg-devel
mailing list