Browse Source

lavc: Add hwaccel private data and init/uninit callbacks

tags/n2.3
Anton Khirnov Luca Barbato 11 years ago
parent
commit
dd2d3b766b
4 changed files with 59 additions and 4 deletions
  1. +23
    -0
      libavcodec/avcodec.h
  2. +5
    -0
      libavcodec/internal.h
  3. +1
    -0
      libavcodec/pthread_frame.c
  4. +30
    -4
      libavcodec/utils.c

+ 23
- 0
libavcodec/avcodec.h View File

@@ -2999,6 +2999,29 @@ typedef struct AVHWAccel {
* AVCodecContext.release_buffer().
*/
int frame_priv_data_size;

/**
* Initialize the hwaccel private data.
*
* This will be called from ff_get_format(), after hwaccel and
* hwaccel_context are set and the hwaccel private data in AVCodecInternal
* is allocated.
*/
int (*init)(AVCodecContext *avctx);

/**
* Uninitialize the hwaccel private data.
*
* This will be called from get_format() or avcodec_close(), after hwaccel
* and hwaccel_context are already uninitialized.
*/
int (*uninit)(AVCodecContext *avctx);

/**
* Size of the private data to allocate in
* AVCodecInternal.hwaccel_priv_data.
*/
int priv_data_size;
} AVHWAccel;

/**


+ 5
- 0
libavcodec/internal.h View File

@@ -95,6 +95,11 @@ typedef struct AVCodecInternal {
* packet into every function.
*/
AVPacket *pkt;

/**
* hwaccel-specific private data
*/
void *hwaccel_priv_data;
} AVCodecInternal;

struct AVCodecDefault {


+ 1
- 0
libavcodec/pthread_frame.c View File

@@ -206,6 +206,7 @@ static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src,

dst->hwaccel = src->hwaccel;
dst->hwaccel_context = src->hwaccel_context;
dst->internal->hwaccel_priv_data = src->internal->hwaccel_priv_data;
}

if (for_user) {


+ 30
- 4
libavcodec/utils.c View File

@@ -893,16 +893,37 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
if (!desc)
return AV_PIX_FMT_NONE;

if (avctx->hwaccel && avctx->hwaccel->uninit)
avctx->hwaccel->uninit(avctx);
av_freep(&avctx->internal->hwaccel_priv_data);
avctx->hwaccel = NULL;

if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
avctx->hwaccel = find_hwaccel(avctx->codec_id, ret);
if (!avctx->hwaccel) {
AVHWAccel *hwaccel;
int err;

hwaccel = find_hwaccel(avctx->codec_id, ret);
if (!hwaccel) {
av_log(avctx, AV_LOG_ERROR,
"Could not find an AVHWAccel for the pixel format: %s",
desc->name);
return AV_PIX_FMT_NONE;
}
} else {
avctx->hwaccel = NULL;

if (hwaccel->priv_data_size) {
avctx->internal->hwaccel_priv_data = av_mallocz(hwaccel->priv_data_size);
if (!avctx->internal->hwaccel_priv_data)
return AV_PIX_FMT_NONE;
}

if (hwaccel->init) {
err = hwaccel->init(avctx);
if (err < 0) {
av_freep(&avctx->internal->hwaccel_priv_data);
return AV_PIX_FMT_NONE;
}
}
avctx->hwaccel = hwaccel;
}

return ret;
@@ -1688,6 +1709,11 @@ av_cold int avcodec_close(AVCodecContext *avctx)
for (i = 0; i < FF_ARRAY_ELEMS(pool->pools); i++)
av_buffer_pool_uninit(&pool->pools[i]);
av_freep(&avctx->internal->pool);

if (avctx->hwaccel && avctx->hwaccel->uninit)
avctx->hwaccel->uninit(avctx);
av_freep(&avctx->internal->hwaccel_priv_data);

av_freep(&avctx->internal);
}



Loading…
Cancel
Save