diff options
author | Gwenole Beauchesne <gbeauchesne@splitted-desktop.com> | 2009-03-09 08:04:41 +0000 |
---|---|---|
committer | Gwenole Beauchesne <gbeauchesne@splitted-desktop.com> | 2009-03-09 08:04:41 +0000 |
commit | 68e5d5235edbb1b837eef046811255a95d6225f9 (patch) | |
tree | e53ea187c7490121a794d9cac4257dc753243530 /libavcodec | |
parent | af79f1ae7804b0c715014a4a53ffb71b6a73d218 (diff) | |
download | ffmpeg-68e5d5235edbb1b837eef046811255a95d6225f9.tar.gz |
Add private HW accel data infrastructure.
Originally committed as revision 17899 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/avcodec.h | 16 | ||||
-rw-r--r-- | libavcodec/mpegvideo.c | 13 |
2 files changed, 29 insertions, 0 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index e57e50f009..8fdc9d1322 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -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; /** diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 43f2f1ff1d..9602604b35 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -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; } |