---
 libavcodec/mimic.c     |    6 +++---
 libavcodec/mpegvideo.c |   18 +++++++++---------
 libavcodec/pthread.c   |   41 +++++++++++++++++------------------------
 libavcodec/thread.h    |   28 +++++++---------------------
 4 files changed, 36 insertions(+), 57 deletions(-)
diff --git a/libavcodec/mimic.c b/libavcodec/mimic.c
index aa13e29..e5b8b5c 100644
--- a/libavcodec/mimic.c
+++ b/libavcodec/mimic.c
@@ -372,7 +372,7 @@ static int mimic_decode_frame(AVCodecContext *avctx, void *data,
     init_get_bits(&ctx->gb, ctx->swap_buf, swap_buf_size << 3);
 
     if(!decode(ctx, quality, num_coeffs, !is_pframe)) {
-        ff_release_buffer(&ctx->buf_ptrs[ctx->cur_index]);
+        ff_release_buffer(avctx, &ctx->buf_ptrs[ctx->cur_index]);
         return -1;
     }
 
@@ -385,7 +385,7 @@ static int mimic_decode_frame(AVCodecContext *avctx, void *data,
 
     /* Only release frames that aren't used for backreferences anymore */
     if(ctx->buf_ptrs[ctx->cur_index].data[0])
-        ff_release_buffer(&ctx->buf_ptrs[ctx->cur_index]);
+        ff_release_buffer(avctx, &ctx->buf_ptrs[ctx->cur_index]);
 
     return buf_size;
 }
@@ -401,7 +401,7 @@ static av_cold int mimic_decode_end(AVCodecContext *avctx)
 
     for(i = 0; i < 16; i++)
         if(ctx->buf_ptrs[i].data[0])
-            ff_release_buffer(&ctx->buf_ptrs[i]);
+            ff_release_buffer(avctx, &ctx->buf_ptrs[i]);
     free_vlc(&ctx->vlc);
 
     return 0;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index b6d2447..9531d5e 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -187,13 +187,13 @@ int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
 
         if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
             av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
-            ff_release_buffer((AVFrame*)pic);
+            ff_release_buffer(s->avctx, (AVFrame*)pic);
             return -1;
         }
 
         if(pic->linesize[1] != pic->linesize[2]){
             av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
-            ff_release_buffer((AVFrame*)pic);
+            ff_release_buffer(s->avctx, (AVFrame*)pic);
             return -1;
         }
 
@@ -244,7 +244,7 @@ int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
     return 0;
 fail: //for the CHECKED_ALLOCZ macro
     if(r>=0)
-        ff_release_buffer((AVFrame*)pic);
+        ff_release_buffer(s->avctx, (AVFrame*)pic);
     return -1;
 }
 
@@ -255,7 +255,7 @@ static void free_picture(MpegEncContext *s, Picture *pic){
     int i;
 
     if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
-        ff_release_buffer((AVFrame*)pic);
+        ff_release_buffer(s->avctx, (AVFrame*)pic);
     }
 
     av_freep(&pic->mb_var);
@@ -912,7 +912,7 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
     /* mark&release old frames */
     if (s->pict_type != FF_B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
       if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
-        ff_delayed_release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
+        ff_release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
 
         /* release forgotten pictures */
         /* if(mpeg124/h263) */
@@ -920,7 +920,7 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
             for(i=0; i<s->picture_count; i++){
                 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
                     av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
-                    ff_delayed_release_buffer(avctx, (AVFrame*)&s->picture[i]);
+                    ff_release_buffer(avctx, (AVFrame*)&s->picture[i]);
                 }
             }
         }
@@ -931,7 +931,7 @@ alloc:
         /* release non reference frames */
         for(i=0; i<s->picture_count; i++){
             if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
-                ff_delayed_release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
+                ff_release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
             }
         }
 
@@ -1073,7 +1073,7 @@ void MPV_frame_end(MpegEncContext *s)
         /* release non-reference frames */
         for(i=0; i<s->picture_count; i++){
             if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
-                 ff_release_buffer((AVFrame*)&s->picture[i]);
+                 ff_release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
             }
         }
     }
@@ -2209,7 +2209,7 @@ void ff_mpeg_flush(AVCodecContext *avctx){
     for(i=0; i<s->picture_count; i++){
        if(s->picture[i].data[0] && (   s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
                                     || s->picture[i].type == FF_BUFFER_TYPE_USER))
-        ff_release_buffer((AVFrame*)&s->picture[i]);
+        ff_release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
     }
     s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
 
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
index ca533eb..324b695 100644
--- a/libavcodec/pthread.c
+++ b/libavcodec/pthread.c
@@ -78,7 +78,7 @@ typedef struct PerThreadContext {
     } state;
 
     /**
-     * Array of frames passed to ff_delayed_release_buffer(),
+     * Array of frames passed to ff_release_buffer(),
      * to be released later.
      */
     AVFrame released_buffers[MAX_DELAYED_RELEASED_BUFFERS];
@@ -381,8 +381,16 @@ static void update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
 
 static void handle_delayed_releases(PerThreadContext *p)
 {
-    while (p->num_released_buffers > 0)
-        ff_release_buffer(&p->released_buffers[--p->num_released_buffers]);
+    while (p->num_released_buffers > 0) {
+        AVFrame *f = &p->released_buffers[--p->num_released_buffers];
+        PerThreadContext *owner = f->owner->thread_opaque;
+
+        av_freep(&f->thread_opaque);
+
+        pthread_mutex_lock(&owner->buffer_mutex);
+        f->owner->release_buffer(f->owner, f);
+        pthread_mutex_unlock(&owner->buffer_mutex);
+    }
 }
 
 static int submit_frame(PerThreadContext * volatile p, const uint8_t *buf, int buf_size)
@@ -577,15 +585,15 @@ void ff_frame_thread_flush(AVCodecContext *avctx)
     if (fctx->prev_thread != fctx->threads)
         update_context_from_copy(fctx->threads->avctx, fctx->prev_thread->avctx, 0);
 
+    if (avctx->codec->flush)
+        avctx->codec->flush(fctx->threads->avctx);
+
     for (i = 0; i < avctx->thread_count; i++) {
         PerThreadContext *p = &fctx->threads[i];
 
         handle_delayed_releases(p);
     }
 
-    if (avctx->codec->flush)
-        avctx->codec->flush(fctx->threads->avctx);
-
     fctx->next_available = fctx->next_ready = 0;
     fctx->delaying = 1;
     fctx->prev_thread = NULL;
@@ -613,28 +621,13 @@ int ff_get_buffer(AVCodecContext *avctx, AVFrame *f)
     return ret;
 }
 
-void ff_release_buffer(AVFrame *f)
-{
-    PerThreadContext *p = f->owner->thread_opaque;
-
-    av_freep(&f->thread_opaque);
-
-    if (!USE_FRAME_THREADING(f->owner)) {
-        f->owner->release_buffer(f->owner, f);
-        return;
-    }
-
-    pthread_mutex_lock(&p->buffer_mutex);
-    f->owner->release_buffer(f->owner, f);
-    pthread_mutex_unlock(&p->buffer_mutex);
-}
-
-void ff_delayed_release_buffer(AVCodecContext *avctx, AVFrame *f)
+void ff_release_buffer(AVCodecContext *avctx, AVFrame *f)
 {
     PerThreadContext *p = avctx->thread_opaque;
 
     if (!USE_FRAME_THREADING(avctx)) {
-        ff_release_buffer(f);
+        av_freep(&f->thread_opaque);
+        avctx->release_buffer(avctx, f);
         return;
     }
 
diff --git a/libavcodec/thread.h b/libavcodec/thread.h
index 0c33ad4..4d26ae5 100644
--- a/libavcodec/thread.h
+++ b/libavcodec/thread.h
@@ -75,26 +75,17 @@ void ff_await_decode_progress(AVFrame *f, int progress);
  * Allocate a frame with avctx->get_buffer() and set
  * values needed for multithreading. Codecs must call
  * this instead of using get_buffer() directly if
- * they support frame threading.
+ * frame threading is enabled.
  */
 int ff_get_buffer(AVCodecContext *avctx, AVFrame *f);
 
 /**
- * Immediately release the passed frame using the context
- * passed to ff_get_buffer(). Codecs must call this instead
- * of avctx->release_buffer() if they support frame threading
- * and the frame can be safely deallocated immediately.
+ * Release a frame at a later time, after all earlier
+ * decoding threads have completed. On return, \p f->data
+ * will be cleared. Codec must call this instead of using
+ * release_buffer() directly if frame threading is enabled.
  */
-void ff_release_buffer(AVFrame *f);
-
-/**
- * Release the passed frame after all decoding threads
- * started earlier than the current thread have completed.
- * This should be used to dispose of reference frames when
- * the current thread no longer needs them, since earlier
- * threads may still be running.
- */
-void ff_delayed_release_buffer(AVCodecContext *avctx, AVFrame *f);
+void ff_release_buffer(AVCodecContext *avctx, AVFrame *f);
 
 ///True if frame threading is active.
 #define USE_FRAME_THREADING(avctx) (avctx->active_thread_algorithm == FF_THREAD_MULTIFRAME)
@@ -114,16 +105,11 @@ static inline int ff_get_buffer(AVCodecContext *avctx, AVFrame *f)
     return avctx->get_buffer(avctx, f);
 }
 
-static inline void ff_release_buffer(AVFrame *f)
+static inline void ff_release_buffer(AVCodecContext *avctx, AVFrame *f)
 {
     f->owner->release_buffer(f->owner, f);
 }
 
-static inline void ff_delayed_release_buffer(AVCodecContext *avctx, AVFrame *f)
-{
-    ff_release_buffer(f);
-}
-
 #define USE_FRAME_THREADING(avctx) 0
 #define USE_AVCODEC_EXECUTE(avctx) (ENABLE_THREADS && avctx->active_thread_algorithm)
 
_______________________________________________
FFmpeg-soc mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc

Reply via email to