[FFmpeg-cvslog] mxf: Introduce ff_mxf_get_samples_per_frame

Matthieu Bouron git at videolan.org
Thu Mar 6 22:28:39 CET 2014


ffmpeg | branch: master | Matthieu Bouron <matthieu.bouron at gmail.com> | Thu Sep 20 20:31:28 2012 +0200| [e118bb1a33889d4df56f28975b4fd0793b4f5c32] | committer: Luca Barbato

mxf: Introduce ff_mxf_get_samples_per_frame

Signed-off-by: Luca Barbato <lu_zero at gentoo.org>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e118bb1a33889d4df56f28975b4fd0793b4f5c32
---

 libavformat/mxf.c |   40 ++++++++++++++++++++++++++++++++++++++++
 libavformat/mxf.h |    7 +++++++
 2 files changed, 47 insertions(+)

diff --git a/libavformat/mxf.c b/libavformat/mxf.c
index d3798cd..01018d3 100644
--- a/libavformat/mxf.c
+++ b/libavformat/mxf.c
@@ -106,3 +106,43 @@ int ff_mxf_decode_pixel_layout(const char pixel_layout[16], enum AVPixelFormat *
 
     return -1;
 }
+
+static const MXFSamplesPerFrame mxf_spf[] = {
+    { { 1001, 24000 }, { 2002, 0,    0,    0,    0,    0 } }, // FILM 23.976
+    { { 1, 24},        { 2000, 0,    0,    0,    0,    0 } }, // FILM 24
+    { { 1001, 30000 }, { 1602, 1601, 1602, 1601, 1602, 0 } }, // NTSC 29.97
+    { { 1001, 60000 }, { 801,  801,  801,  801,  800,  0 } }, // NTSC 59.94
+    { { 1, 25 },       { 1920, 0,    0,    0,    0,    0 } }, // PAL 25
+    { { 1, 50 },       { 960,  0,    0,    0,    0,    0 } }, // PAL 50
+};
+
+static const AVRational mxf_time_base[] = {
+    { 1001, 24000 },
+    { 1, 24},
+    { 1001, 30000 },
+    { 1001, 60000 },
+    { 1, 25 },
+    { 1, 50 },
+    { 0, 0}
+};
+
+const MXFSamplesPerFrame *ff_mxf_get_samples_per_frame(AVFormatContext *s,
+                                                       AVRational time_base)
+{
+    int idx = av_find_nearest_q_idx(time_base, mxf_time_base);
+    AVRational diff = av_sub_q(time_base, mxf_time_base[idx]);
+
+    diff.num = abs(diff.num);
+
+    if (av_cmp_q(diff, (AVRational){1, 1000}) >= 0)
+        return NULL;
+
+    if (av_cmp_q(time_base, mxf_time_base[idx]))
+        av_log(s, AV_LOG_WARNING,
+               "%d/%d input time base matched %d/%d container time base\n",
+               time_base.num, time_base.den,
+               mxf_spf[idx].time_base.num,
+               mxf_spf[idx].time_base.den);
+
+    return &mxf_spf[idx];
+}
diff --git a/libavformat/mxf.h b/libavformat/mxf.h
index 773f30f..265b0cf 100644
--- a/libavformat/mxf.h
+++ b/libavformat/mxf.h
@@ -21,6 +21,7 @@
 #ifndef AVFORMAT_MXF_H
 #define AVFORMAT_MXF_H
 
+#include "avformat.h"
 #include "libavcodec/avcodec.h"
 #include <stdint.h>
 
@@ -66,11 +67,17 @@ typedef struct MXFCodecUL {
     int id;
 } MXFCodecUL;
 
+typedef struct MXFSamplesPerFrame {
+    struct AVRational time_base;
+    int samples_per_frame[6];
+} MXFSamplesPerFrame;
+
 extern const MXFCodecUL ff_mxf_data_definition_uls[];
 extern const MXFCodecUL ff_mxf_codec_uls[];
 extern const MXFCodecUL ff_mxf_pixel_format_uls[];
 
 int ff_mxf_decode_pixel_layout(const char pixel_layout[16], enum AVPixelFormat *pix_fmt);
+const MXFSamplesPerFrame *ff_mxf_get_samples_per_frame(AVFormatContext *s, AVRational time_base);
 
 #define PRINT_KEY(pc, s, x) av_dlog(pc, "%s %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", s, \
                              (x)[0], (x)[1], (x)[2], (x)[3], (x)[4], (x)[5], (x)[6], (x)[7], (x)[8], (x)[9], (x)[10], (x)[11], (x)[12], (x)[13], (x)[14], (x)[15])



More information about the ffmpeg-cvslog mailing list