---
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