Add private HW accel data infrastructure.
authorGwenole Beauchesne <gbeauchesne@splitted-desktop.com>
Mon, 9 Mar 2009 08:04:41 +0000 (08:04 +0000)
committerGwenole Beauchesne <gbeauchesne@splitted-desktop.com>
Mon, 9 Mar 2009 08:04:41 +0000 (08:04 +0000)
Originally committed as revision 17899 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/mpegvideo.c

index e57e50f..8fdc9d1 100644 (file)
@@ -807,6 +807,13 @@ typedef struct AVPanScan{
      * - decoding: Read by user.\
      */\
     int64_t reordered_opaque;\
+\
+    /**\
+     * hardware accelerator private data (FFmpeg allocated)\
+     * - encoding: unused\
+     * - decoding: Set by libavcodec\
+     */\
+    void *hwaccel_data_private;\
 
 
 #define FF_QSCALE_TYPE_MPEG1 0
@@ -2456,6 +2463,15 @@ typedef struct AVHWAccel {
      * @return zero if successful, a negative value otherwise
      */
     int (*end_frame)(AVCodecContext *avctx);
+
+    /**
+     * Size of HW accelerator private data.
+     *
+     * Private data is allocated with av_malloc() before
+     * AVCodecContext::get_buffer() and deallocated after
+     * AVCodecContext::release_buffer().
+     */
+    int priv_data_size;
 } AVHWAccel;
 
 /**
index 43f2f1f..9602604 100644 (file)
@@ -170,6 +170,7 @@ void ff_copy_picture(Picture *dst, Picture *src){
 static void free_frame_buffer(MpegEncContext *s, Picture *pic)
 {
     s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
+    av_freep(&pic->hwaccel_data_private);
 }
 
 /**
@@ -179,10 +180,22 @@ static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
 {
     int r;
 
+    if (s->avctx->hwaccel) {
+        assert(!pic->hwaccel_data_private);
+        if (s->avctx->hwaccel->priv_data_size) {
+            pic->hwaccel_data_private = av_malloc(s->avctx->hwaccel->priv_data_size);
+            if (!pic->hwaccel_data_private) {
+                av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
+                return -1;
+            }
+        }
+    }
+
     r = s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
 
     if (r<0 || !pic->age || !pic->type || !pic->data[0]) {
         av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
+        av_freep(&pic->hwaccel_data_private);
         return -1;
     }