[FFmpeg-devel] [PATCH] Delay FF_API_AVFRAME_COLORSPACE until the next libavutil soname bump

Michael Niedermayer michaelni at gmx.at
Mon Jul 28 04:30:02 CEST 2014


This works around ABI issues with applications which depend on libavutil
internal values like sizeof(AVFrame)
One such application is VLC 2.1.4 as well as 2.1.5

Found-by: Andreas Cadhalpun <andreas.cadhalpun at googlemail.com>
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 libavcodec/utils.c  |    8 ++++----
 libavutil/frame.c   |    8 ++++----
 libavutil/frame.h   |   20 ++++++++++++++++++++
 libavutil/version.h |    2 +-
 4 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 6071380..26baa94 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -780,15 +780,15 @@ int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame)
     }
     frame->reordered_opaque = avctx->reordered_opaque;
 
+    if (av_frame_get_colorspace(frame) == AVCOL_SPC_UNSPECIFIED)
+        av_frame_set_colorspace(frame, avctx->colorspace);
+    if (av_frame_get_color_range(frame) == AVCOL_RANGE_UNSPECIFIED)
+        av_frame_set_color_range(frame, avctx->color_range);
 #if FF_API_AVFRAME_COLORSPACE
     if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED)
         frame->color_primaries = avctx->color_primaries;
     if (frame->color_trc == AVCOL_TRC_UNSPECIFIED)
         frame->color_trc = avctx->color_trc;
-    if (av_frame_get_colorspace(frame) == AVCOL_SPC_UNSPECIFIED)
-        av_frame_set_colorspace(frame, avctx->colorspace);
-    if (av_frame_get_color_range(frame) == AVCOL_RANGE_UNSPECIFIED)
-        av_frame_set_color_range(frame, avctx->color_range);
     if (frame->chroma_location == AVCHROMA_LOC_UNSPECIFIED)
         frame->chroma_location = avctx->chroma_sample_location;
 #endif
diff --git a/libavutil/frame.c b/libavutil/frame.c
index fdfbc46..f18f9c1 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -104,11 +104,11 @@ static void get_frame_defaults(AVFrame *frame)
     frame->sample_aspect_ratio = (AVRational){ 0, 1 };
     frame->format              = -1; /* unknown */
     frame->extended_data       = frame->data;
+    frame->colorspace          = AVCOL_SPC_UNSPECIFIED;
+    frame->color_range         = AVCOL_RANGE_UNSPECIFIED;
 #if FF_API_AVFRAME_COLORSPACE
     frame->color_primaries     = AVCOL_PRI_UNSPECIFIED;
     frame->color_trc           = AVCOL_TRC_UNSPECIFIED;
-    frame->colorspace          = AVCOL_SPC_UNSPECIFIED;
-    frame->color_range         = AVCOL_RANGE_UNSPECIFIED;
     frame->chroma_location     = AVCHROMA_LOC_UNSPECIFIED;
 #endif
 }
@@ -482,11 +482,11 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
     dst->display_picture_number = src->display_picture_number;
     dst->flags                  = src->flags;
     dst->decode_error_flags     = src->decode_error_flags;
+    dst->colorspace             = src->colorspace;
+    dst->color_range            = src->color_range;
 #if FF_API_AVFRAME_COLORSPACE
     dst->color_primaries        = src->color_primaries;
     dst->color_trc              = src->color_trc;
-    dst->colorspace             = src->colorspace;
-    dst->color_range            = src->color_range;
     dst->chroma_location        = src->chroma_location;
 #endif
 
diff --git a/libavutil/frame.h b/libavutil/frame.h
index a39c8d0..93d27ad 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -526,6 +526,26 @@ typedef struct AVFrame {
      */
     int pkt_size;
 
+#if !FF_API_AVFRAME_COLORSPACE
+    /**
+     * MPEG vs JPEG YUV range.
+     * It must be accessed using av_frame_get_color_range() and
+     * av_frame_set_color_range().
+     * - encoding: Set by user
+     * - decoding: Set by libavcodec
+     */
+    enum AVColorRange color_range;
+
+    /**
+     * YUV colorspace type.
+     * It must be accessed using av_frame_get_colorspace() and
+     * av_frame_set_colorspace().
+     * - encoding: Set by user
+     * - decoding: Set by libavcodec
+     */
+    enum AVColorSpace colorspace;
+#endif
+
     /**
      * Not to be accessed directly from outside libavutil
      */
diff --git a/libavutil/version.h b/libavutil/version.h
index 6d8d6f0..1deb6e4 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -138,7 +138,7 @@
 #define FF_API_OPT_TYPE_METADATA        (LIBAVUTIL_VERSION_MAJOR < 54)
 #endif
 #ifndef FF_API_AVFRAME_COLORSPACE
-#define FF_API_AVFRAME_COLORSPACE       (LIBAVUTIL_VERSION_MAJOR >= 52)
+#define FF_API_AVFRAME_COLORSPACE       (LIBAVUTIL_VERSION_MAJOR >= 53)
 #endif
 
 
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list