[FFmpeg-cvslog] lavc: add a field for passing AVHWFramesContext to encoders

Anton Khirnov git at videolan.org
Wed Feb 24 18:06:48 CET 2016


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Mon Feb  1 15:39:50 2016 +0100| [7b3214d0050613bd347a2e41c9f78ffb766da25e] | committer: Anton Khirnov

lavc: add a field for passing AVHWFramesContext to encoders

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

 doc/APIchanges       |    3 +++
 libavcodec/avcodec.h |   12 ++++++++++++
 libavcodec/utils.c   |   13 +++++++++++++
 libavcodec/version.h |    2 +-
 4 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index d10cf98..b9a0008 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil:     2015-08-28
 
 API changes, most recent first:
 
+2016-xx-xx - lavc 57.13.0 - avcodec.h
+  Add AVCodecContext.hw_frames_ctx.
+
 2016-xx-xx - lavfi 6.2.0 - avfilter.h
   xxxxxxx avfilter.h - Add AVFilterLink.hw_frames_ctx.
   xxxxxxx buffersrc.h - Add AVBufferSrcParameters and functions for handling it.
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index fe3366b..12458ab 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2979,6 +2979,18 @@ typedef struct AVCodecContext {
     AVPacketSideData *coded_side_data;
     int            nb_coded_side_data;
 
+    /**
+     * Encoding only.
+     *
+     * For hardware encoders configured to use a hwaccel pixel format, this
+     * field should be set by the caller to a reference to the AVHWFramesContext
+     * describing input frames. AVHWFramesContext.format must be equal to
+     * AVCodecContext.pix_fmt.
+     *
+     * This field should be set before avcodec_open2() is called and is
+     * afterwards owned and managed by libavcodec.
+     */
+    AVBufferRef *hw_frames_ctx;
 } AVCodecContext;
 
 /**
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index e06ee66..94ec1e8 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -32,6 +32,7 @@
 #include "libavutil/channel_layout.h"
 #include "libavutil/crc.h"
 #include "libavutil/frame.h"
+#include "libavutil/hwcontext.h"
 #include "libavutil/internal.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/pixdesc.h"
@@ -1059,6 +1060,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
                    avctx->time_base.den);
             goto free_and_end;
         }
+
+        if (avctx->hw_frames_ctx) {
+            AVHWFramesContext *frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
+            if (frames_ctx->format != avctx->pix_fmt) {
+                av_log(avctx, AV_LOG_ERROR,
+                       "Mismatching AVCodecContext.pix_fmt and AVHWFramesContext.format\n");
+                ret = AVERROR(EINVAL);
+                goto free_and_end;
+            }
+        }
     }
 
     if (avctx->codec->init && !(avctx->active_thread_type & FF_THREAD_FRAME)) {
@@ -1639,6 +1650,8 @@ av_cold int avcodec_close(AVCodecContext *avctx)
     av_freep(&avctx->coded_side_data);
     avctx->nb_coded_side_data = 0;
 
+    av_buffer_unref(&avctx->hw_frames_ctx);
+
     if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)
         av_opt_free(avctx->priv_data);
     av_opt_free(avctx);
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 9c40c79..18d2754 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,7 +29,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR 57
-#define LIBAVCODEC_VERSION_MINOR 12
+#define LIBAVCODEC_VERSION_MINOR 13
 #define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \



More information about the ffmpeg-cvslog mailing list