[FFmpeg-cvslog] frame_thread_encoder: fix handling of case where the encoder does not output a packet.

Michael Niedermayer git at videolan.org
Mon Nov 5 14:00:57 CET 2012


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Mon Nov  5 13:18:13 2012 +0100| [f4aaf987a588fcf5978e636edf2193df35b3e83b] | committer: 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: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f4aaf987a588fcf5978e636edf2193df35b3e83b
---

 libavcodec/frame_thread_encoder.c |   12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c
index 664526a..208874c 100644
--- a/libavcodec/frame_thread_encoder.c
+++ b/libavcodec/frame_thread_encoder.c
@@ -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;
 }



More information about the ffmpeg-cvslog mailing list