[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