lavc: Add hwaccel private data and init/uninit callbacks
This commit is contained in:
parent
ebc29519d1
commit
dd2d3b766b
@ -2999,6 +2999,29 @@ typedef struct AVHWAccel {
|
|||||||
* AVCodecContext.release_buffer().
|
* AVCodecContext.release_buffer().
|
||||||
*/
|
*/
|
||||||
int frame_priv_data_size;
|
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;
|
} AVHWAccel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -95,6 +95,11 @@ typedef struct AVCodecInternal {
|
|||||||
* packet into every function.
|
* packet into every function.
|
||||||
*/
|
*/
|
||||||
AVPacket *pkt;
|
AVPacket *pkt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hwaccel-specific private data
|
||||||
|
*/
|
||||||
|
void *hwaccel_priv_data;
|
||||||
} AVCodecInternal;
|
} AVCodecInternal;
|
||||||
|
|
||||||
struct AVCodecDefault {
|
struct AVCodecDefault {
|
||||||
|
@ -206,6 +206,7 @@ static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src,
|
|||||||
|
|
||||||
dst->hwaccel = src->hwaccel;
|
dst->hwaccel = src->hwaccel;
|
||||||
dst->hwaccel_context = src->hwaccel_context;
|
dst->hwaccel_context = src->hwaccel_context;
|
||||||
|
dst->internal->hwaccel_priv_data = src->internal->hwaccel_priv_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (for_user) {
|
if (for_user) {
|
||||||
|
@ -893,16 +893,37 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
|
|||||||
if (!desc)
|
if (!desc)
|
||||||
return AV_PIX_FMT_NONE;
|
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) {
|
if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
|
||||||
avctx->hwaccel = find_hwaccel(avctx->codec_id, ret);
|
AVHWAccel *hwaccel;
|
||||||
if (!avctx->hwaccel) {
|
int err;
|
||||||
|
|
||||||
|
hwaccel = find_hwaccel(avctx->codec_id, ret);
|
||||||
|
if (!hwaccel) {
|
||||||
av_log(avctx, AV_LOG_ERROR,
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
"Could not find an AVHWAccel for the pixel format: %s",
|
"Could not find an AVHWAccel for the pixel format: %s",
|
||||||
desc->name);
|
desc->name);
|
||||||
return AV_PIX_FMT_NONE;
|
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;
|
return ret;
|
||||||
@ -1688,6 +1709,11 @@ av_cold int avcodec_close(AVCodecContext *avctx)
|
|||||||
for (i = 0; i < FF_ARRAY_ELEMS(pool->pools); i++)
|
for (i = 0; i < FF_ARRAY_ELEMS(pool->pools); i++)
|
||||||
av_buffer_pool_uninit(&pool->pools[i]);
|
av_buffer_pool_uninit(&pool->pools[i]);
|
||||||
av_freep(&avctx->internal->pool);
|
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);
|
av_freep(&avctx->internal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user