|
|
|
@ -126,7 +126,7 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
int i=0; |
|
|
|
|
ThreadContext *c; |
|
|
|
|
|
|
|
|
|
AVCodecContext *thread_avctx = NULL; |
|
|
|
|
|
|
|
|
|
if( !(avctx->thread_type & FF_THREAD_FRAME) |
|
|
|
|
|| !(avctx->codec->capabilities & AV_CODEC_CAP_FRAME_THREADS)) |
|
|
|
@ -202,16 +202,17 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx) |
|
|
|
|
for(i=0; i<avctx->thread_count ; i++){ |
|
|
|
|
int ret; |
|
|
|
|
void *tmpv; |
|
|
|
|
AVCodecContext *thread_avctx = avcodec_alloc_context3(avctx->codec); |
|
|
|
|
thread_avctx = avcodec_alloc_context3(avctx->codec); |
|
|
|
|
if(!thread_avctx) |
|
|
|
|
goto fail; |
|
|
|
|
tmpv = thread_avctx->priv_data; |
|
|
|
|
*thread_avctx = *avctx; |
|
|
|
|
thread_avctx->priv_data = tmpv; |
|
|
|
|
thread_avctx->internal = NULL; |
|
|
|
|
thread_avctx->hw_frames_ctx = NULL; |
|
|
|
|
ret = av_opt_copy(thread_avctx, avctx); |
|
|
|
|
if (ret < 0) |
|
|
|
|
goto fail; |
|
|
|
|
thread_avctx->priv_data = tmpv; |
|
|
|
|
thread_avctx->internal = NULL; |
|
|
|
|
if (avctx->codec->priv_class) { |
|
|
|
|
int ret = av_opt_copy(thread_avctx->priv_data, avctx->priv_data); |
|
|
|
|
if (ret < 0) |
|
|
|
@ -233,6 +234,8 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx) |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
fail: |
|
|
|
|
avcodec_close(thread_avctx); |
|
|
|
|
av_freep(&thread_avctx); |
|
|
|
|
avctx->thread_count = i; |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "ff_frame_thread_encoder_init failed\n"); |
|
|
|
|
ff_frame_thread_encoder_free(avctx); |
|
|
|
|