frame_thread_encoder: use ref-counting to avoid memcpy of all input frames

Apparently uneeded lock/unlock removed by commiter

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Hendrik Leppkes 2014-12-23 00:42:49 +01:00 committed by Michael Niedermayer
parent fe439c2069
commit 1ffcf6ac90
1 changed files with 8 additions and 16 deletions

View File

@ -254,25 +254,17 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVF
av_assert1(!*got_packet_ptr); av_assert1(!*got_packet_ptr);
if(frame){ if(frame){
if(!(avctx->flags & CODEC_FLAG_INPUT_PRESERVED)){ AVFrame *new = av_frame_alloc();
AVFrame *new = av_frame_alloc(); if(!new)
if(!new) return AVERROR(ENOMEM);
return AVERROR(ENOMEM); ret = av_frame_ref(new, frame);
pthread_mutex_lock(&c->buffer_mutex); if(ret < 0) {
ret = ff_get_buffer(c->parent_avctx, new, 0); av_frame_free(&new);
pthread_mutex_unlock(&c->buffer_mutex); return ret;
if(ret<0)
return ret;
new->pts = frame->pts;
new->quality = frame->quality;
new->pict_type = frame->pict_type;
av_image_copy(new->data, new->linesize, (const uint8_t **)frame->data, frame->linesize,
avctx->pix_fmt, avctx->width, avctx->height);
frame = new;
} }
task.index = c->task_index; task.index = c->task_index;
task.indata = (void*)frame; task.indata = (void*)new;
pthread_mutex_lock(&c->task_fifo_mutex); pthread_mutex_lock(&c->task_fifo_mutex);
av_fifo_generic_write(c->task_fifo, &task, sizeof(task), NULL); av_fifo_generic_write(c->task_fifo, &task, sizeof(task), NULL);
pthread_cond_signal(&c->task_fifo_cond); pthread_cond_signal(&c->task_fifo_cond);