Add private HW accel data infrastructure.
Originally committed as revision 17899 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@@ -807,6 +807,13 @@ typedef struct AVPanScan{
|
|||||||
* - decoding: Read by user.\
|
* - decoding: Read by user.\
|
||||||
*/\
|
*/\
|
||||||
int64_t reordered_opaque;\
|
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
|
#define FF_QSCALE_TYPE_MPEG1 0
|
||||||
@@ -2456,6 +2463,15 @@ typedef struct AVHWAccel {
|
|||||||
* @return zero if successful, a negative value otherwise
|
* @return zero if successful, a negative value otherwise
|
||||||
*/
|
*/
|
||||||
int (*end_frame)(AVCodecContext *avctx);
|
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;
|
} AVHWAccel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -170,6 +170,7 @@ void ff_copy_picture(Picture *dst, Picture *src){
|
|||||||
static void free_frame_buffer(MpegEncContext *s, Picture *pic)
|
static void free_frame_buffer(MpegEncContext *s, Picture *pic)
|
||||||
{
|
{
|
||||||
s->avctx->release_buffer(s->avctx, (AVFrame*)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;
|
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);
|
r = s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
|
||||||
|
|
||||||
if (r<0 || !pic->age || !pic->type || !pic->data[0]) {
|
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_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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user