Module: libav
Branch: master
Commit: 05fa79b8448059913dea321fdf92764b64deeecc

Author:    Janne Grunau <[email protected]>
Committer: Janne Grunau <[email protected]>
Date:      Wed Mar 13 23:36:51 2013 +0100

hwaccel: fix use with frame based multithreading

Allows use of AVHWAccel based decoders with frame based multithreading.
The decoders will be forced into an non-concurrent mode by delaying
ff_thread_finish_setup() calls after decoding of the current frame
is finished.

This wastes memory by unnecessarily using multiple threads and thus
copies of the decoder context but allows seamless switching between
hardware accelerated and frame threaded software decoding when the
hardware decoder does not support the stream.

---

 libavcodec/h263dec.c |    6 +++++-
 libavcodec/h264.c    |    2 +-
 libavcodec/pthread.c |    3 +++
 libavcodec/version.h |    2 +-
 4 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 28fb2db..e8edad7 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -627,7 +627,8 @@ retry:
     if(ff_MPV_frame_start(s, avctx) < 0)
         return -1;
 
-    if (!s->divx_packed) ff_thread_finish_setup(avctx);
+    if (!s->divx_packed && !avctx->hwaccel)
+        ff_thread_finish_setup(avctx);
 
     if (CONFIG_MPEG4_VDPAU_DECODER && (s->avctx->codec->capabilities & 
CODEC_CAP_HWACCEL_VDPAU)) {
         ff_vdpau_mpeg4_decode_picture(s, s->gb.buffer, s->gb.buffer_end - 
s->gb.buffer);
@@ -720,6 +721,9 @@ intrax8_decoded:
 
     ff_MPV_frame_end(s);
 
+    if (!s->divx_packed && avctx->hwaccel)
+        ff_thread_finish_setup(avctx);
+
     assert(s->current_picture.f.pict_type == 
s->current_picture_ptr->f.pict_type);
     assert(s->current_picture.f.pict_type == s->pict_type);
     if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index f6f00bd..6721365 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -2032,7 +2032,7 @@ static void decode_postinit(H264Context *h, int 
setup_finished)
         av_log(h->avctx, AV_LOG_DEBUG, "no picture\n");
     }
 
-    if (setup_finished)
+    if (setup_finished && !h->avctx->hwaccel)
         ff_thread_finish_setup(h->avctx);
 }
 
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
index 9a92288..404804d 100644
--- a/libavcodec/pthread.c
+++ b/libavcodec/pthread.c
@@ -428,6 +428,9 @@ static int update_context_from_thread(AVCodecContext *dst, 
AVCodecContext *src,
         dst->colorspace  = src->colorspace;
         dst->color_range = src->color_range;
         dst->chroma_sample_location = src->chroma_sample_location;
+
+        dst->hwaccel = src->hwaccel;
+        dst->hwaccel_context = src->hwaccel_context;
     }
 
     if (for_user) {
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 8b4fbce..394bf1a 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -27,7 +27,7 @@
  */
 
 #define LIBAVCODEC_VERSION_MAJOR 55
-#define LIBAVCODEC_VERSION_MINOR  0
+#define LIBAVCODEC_VERSION_MINOR  1
 #define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \

_______________________________________________
libav-commits mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-commits

Reply via email to