mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 03:59:43 +00:00
frame_thread_encoder: fix handling of case where the encoder does not output a packet.
This case could cause a deadlock Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
17e67c5321
commit
f4aaf987a5
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user