Commit f4aaf987 authored by Michael Niedermayer's avatar Michael Niedermayer

frame_thread_encoder: fix handling of case where the encoder does not output a packet.

This case could cause a deadlock
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 17e67c53
......@@ -95,9 +95,11 @@ static void * attribute_align_arg worker(void *v){
c->parent_avctx->release_buffer(c->parent_avctx, frame);
pthread_mutex_unlock(&c->buffer_mutex);
av_freep(&frame);
if(!got_packet)
continue;
av_dup_packet(pkt);
if(got_packet) {
av_dup_packet(pkt);
} else {
pkt->data = pkt->size = 0;
}
pthread_mutex_lock(&c->finished_task_mutex);
c->finished_tasks[task.index].outdata = pkt; pkt = NULL;
c->finished_tasks[task.index].return_code = ret;
......@@ -257,11 +259,11 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVF
}
task = c->finished_tasks[c->finished_task_index];
*pkt = *(AVPacket*)(task.outdata);
if(pkt->data)
*got_packet_ptr = 1;
av_freep(&c->finished_tasks[c->finished_task_index].outdata);
c->finished_task_index = (c->finished_task_index+1) % BUFFER_SIZE;
pthread_mutex_unlock(&c->finished_task_mutex);
*got_packet_ptr = 1;
return task.return_code;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment