]> granicus.if.org Git - handbrake/commitdiff
libhb: fix build with --enable-qsv
authorTim Walker <tdskywalker@gmail.com>
Fri, 1 Apr 2016 04:12:31 +0000 (06:12 +0200)
committerJohn Stebbins <jstebbins.hb@gmail.com>
Sat, 17 Dec 2016 15:28:51 +0000 (07:28 -0800)
Convert qsv_livav.[ch] to be built within libhb.

Convert other files to use qsv_libav.h in place of libavcodec/qsv.h

Don't attempt to build libav with QSV support (not available in unpatched release/11 branch).

QSV-accelerated decoding is broken, so disable it for the time being.

contrib/ffmpeg/module.defs
libhb/common.h
libhb/fifo.c
libhb/internal.h
libhb/qsv_common.c
libhb/qsv_filter.c
libhb/qsv_filter_pp.c
libhb/qsv_libav.c
libhb/qsv_libav.h
libhb/qsv_memory.h

index 5ffd508c2f7761314d2a9dabeb06e48946e15685..156c21524a729793544c9e6a6d46e9d4042beea2 100644 (file)
@@ -107,9 +107,10 @@ ifeq (none,$(FFMPEG.GCC.O))
     FFMPEG.CONFIGURE.extra += --disable-optimizations
 endif
 
-ifeq (1,$(FEATURE.qsv))
-   FFMPEG.CONFIGURE.extra += --enable-qsv
-endif
+## not supported in release/11 branch without our patch
+## ifeq (1,$(FEATURE.qsv))
+##   FFMPEG.CONFIGURE.extra += --enable-qsv
+## endif
 
 ## enable compile verbosity
 FFMPEG.BUILD.extra = V=1
index 0e43c007c8ae891e83310d4992b2a339e0bc05f1..9950f0e2ddb434caba5e98b0aa4d22e8e567b387 100644 (file)
@@ -103,7 +103,7 @@ typedef enum
 #include "libavutil/channel_layout.h"
 
 #ifdef USE_QSV
-#include "libavcodec/qsv.h"
+#include "qsv_libav.h"
 #endif
 
 struct hb_buffer_list_s
index 7738868a172b4a35cb97274fcf6e33b696a40cd5..5ec49bf86ceba24962de90a0ce3444cf2df925dd 100644 (file)
@@ -10,7 +10,7 @@
 #include "hb.h"
 #include "openclwrapper.h"
 #ifdef USE_QSV
-#include "libavcodec/qsv.h"
+#include "qsv_libav.h"
 #endif
 
 #ifndef SYS_DARWIN
index c189591b4f91758f5d0a92cc58e1877d87925252..9344636bf307ae3e44822c1d22123325b0eb7c33 100644 (file)
@@ -10,7 +10,7 @@
 #include "hbffmpeg.h"
 #include "extras/cl.h"
 #ifdef USE_QSV
-#include "libavcodec/qsv.h"
+#include "qsv_libav.h"
 #endif
 
 /***********************************************************************
index bb5dbc15a95e523adf32ce5bdd629216f0e9c32e..2c2d827c64598b8c57932232d3ad0a842a4a5c82 100644 (file)
@@ -912,9 +912,17 @@ const char* hb_qsv_decode_get_codec_name(enum AVCodecID codec_id)
 
 int hb_qsv_decode_is_enabled(hb_job_t *job)
 {
-    return ((job != NULL && job->qsv.decode)                        &&
-            (job->vcodec                      & HB_VCODEC_QSV_MASK) &&
-            (job->title->video_decode_support & HB_DECODE_SUPPORT_QSV));
+    /*
+     * XXX: we haven't yet adjusted our QSV decoder wrapper to use libav's new
+     *      QSV-accelerated decoder, and our old custom QSV-accelerated decoder
+     *      for libav hasn't been updated to work with newer libav releases, so
+     *      we can't use QSV-accelerated decoding at all for the time being.
+     *
+     * return ((job != NULL && job->qsv.decode)                        &&
+     *         (job->vcodec                      & HB_VCODEC_QSV_MASK) &&
+     *         (job->title->video_decode_support & HB_DECODE_SUPPORT_QSV));
+     */
+    return 0;
 }
 
 int hb_qsv_copyframe_is_slow(int encoder)
index 1a676ee2b5c5825ad9f7a7ebe7a52f84d7b2c943..2a1ae0e40b6561b18c5cb64cb1d0d93c358b27d0 100644 (file)
@@ -30,8 +30,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include "hb.h"
 #include "hbffmpeg.h"
-#include "libavcodec/qsv.h"
 #include "qsv_filter.h"
+#include "qsv_libav.h"
 
 struct hb_filter_private_s
 {
index 7850d3b9ab6b293f2703ad9b8899af173f0686b8..05b18bf7e9ccfeef1ffaab636292106ea90b5f91 100644 (file)
@@ -30,9 +30,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include "hb.h"
 #include "hbffmpeg.h"
-#include "libavcodec/qsv.h"
 #include "qsv_filter_pp.h"
 #include "qsv_filter.h"
+#include "qsv_libav.h"
 #include "qsv_memory.h"
 
 
index 2c46111ec91ca69945532b7a6f88e5550f266119..2300327260fedb5aa6cda3fa4cc4e169a8d62c5b 100644 (file)
@@ -26,10 +26,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 \* ********************************************************************* */
 
-#include "qsv.h"
+#ifdef USE_QSV
 
-#include "avcodec.h"
-#include "internal.h"
+#include "hbffmpeg.h"
+#include "qsv_libav.h"
 
 int av_qsv_get_free_encode_task(av_qsv_list * tasks)
 {
@@ -62,16 +62,12 @@ int av_qsv_get_free_sync(av_qsv_space * space, av_qsv_context * qsv)
                 return i;
             }
         }
-#if HAVE_THREADS
         if (++counter >= AV_QSV_REPEAT_NUM_DEFAULT) {
-#endif
             av_log(NULL, AV_LOG_FATAL, "not enough to have %d sync point(s) allocated\n",
                    space->sync_num);
             break;
-#if HAVE_THREADS
         }
         av_qsv_sleep(5);
-#endif
     }
     return ret;
 }
@@ -101,16 +97,12 @@ int av_qsv_get_free_surface(av_qsv_space * space, av_qsv_context * qsv,
                 return i;
             }
         }
-#if HAVE_THREADS
         if (++counter >= AV_QSV_REPEAT_NUM_DEFAULT) {
-#endif
             av_log(NULL, AV_LOG_FATAL,
                    "not enough to have %d surface(s) allocated\n", up);
             break;
-#if HAVE_THREADS
         }
         av_qsv_sleep(5);
-#endif
     }
     return ret;
 }
@@ -193,9 +185,7 @@ void av_qsv_stage_clean(av_qsv_stage ** stage)
 void av_qsv_add_context_usage(av_qsv_context * qsv, int is_threaded)
 {
     int is_active = 0;
-#if HAVE_THREADS
     int mut_ret = 0;
-#endif
 
     is_active = ff_qsv_atomic_inc(&qsv->is_context_active);
     if (is_active == 1) {
@@ -204,7 +194,6 @@ void av_qsv_add_context_usage(av_qsv_context * qsv, int is_threaded)
 
         qsv->dts_seq = av_qsv_list_init(is_threaded);
 
-#if HAVE_THREADS
         if (is_threaded) {
             qsv->qts_seq_mutex = av_mallocz(sizeof(pthread_mutex_t));
             if (qsv->qts_seq_mutex){
@@ -214,7 +203,6 @@ void av_qsv_add_context_usage(av_qsv_context * qsv, int is_threaded)
             }
 
         } else
-#endif
             qsv->qts_seq_mutex = 0;
     }
 }
@@ -223,9 +211,7 @@ int av_qsv_context_clean(av_qsv_context * qsv)
 {
     int is_active = 0;
     mfxStatus sts = MFX_ERR_NONE;
-#if HAVE_THREADS
     int mut_ret = 0;
-#endif
 
     is_active = ff_qsv_atomic_dec(&qsv->is_context_active);
 
@@ -239,16 +225,12 @@ int av_qsv_context_clean(av_qsv_context * qsv)
 
             av_qsv_list_close(&qsv->dts_seq);
         }
-#if HAVE_THREADS
         if (qsv->qts_seq_mutex) {
             mut_ret = pthread_mutex_destroy(qsv->qts_seq_mutex);
             if(mut_ret)
                 av_log(NULL, AV_LOG_ERROR, "pthread_mutex_destroy issue[%d] at %s\n", mut_ret,__FUNCTION__);
-#endif
             qsv->qts_seq_mutex = 0;
-#if HAVE_THREADS
         }
-#endif
 
         if (qsv->pipes)
             av_qsv_pipe_list_clean(&qsv->pipes);
@@ -360,18 +342,14 @@ void av_qsv_dts_ordered_insert(av_qsv_context * qsv, int start, int end,
     av_qsv_dts *cur_dts = 0;
     av_qsv_dts *new_dts = 0;
     int i = 0;
-#if HAVE_THREADS
     int mut_ret = 0;
-#endif
 
 
-#if HAVE_THREADS
     if (iter == 0 && qsv->qts_seq_mutex){
         mut_ret = pthread_mutex_lock(qsv->qts_seq_mutex);
         if(mut_ret)
             av_log(NULL, AV_LOG_ERROR, "pthread_mutex_lock issue[%d] at %s\n",mut_ret, __FUNCTION__);
     }
-#endif
 
     if (end == 0)
         end = av_qsv_list_count(qsv->dts_seq);
@@ -395,51 +373,41 @@ void av_qsv_dts_ordered_insert(av_qsv_context * qsv, int start, int end,
             } else if (cur_dts->dts == dts)
                 break;
         }
-#if HAVE_THREADS
     if (iter == 0 && qsv->qts_seq_mutex){
         mut_ret = pthread_mutex_unlock(qsv->qts_seq_mutex);
         if(mut_ret)
             av_log(NULL, AV_LOG_ERROR, "pthread_mutex_unlock issue[%d] at %s\n",mut_ret, __FUNCTION__);
     }
-#endif
 }
 
 void av_qsv_dts_pop(av_qsv_context * qsv)
 {
     av_qsv_dts *item = 0;
-#if HAVE_THREADS
     int mut_ret = 0;
-#endif
 
-#if HAVE_THREADS
     if (qsv && qsv->qts_seq_mutex){
         mut_ret = pthread_mutex_lock(qsv->qts_seq_mutex);
         if(mut_ret)
             av_log(NULL, AV_LOG_ERROR, "pthread_mutex_lock issue[%d] at %s\n",mut_ret, __FUNCTION__);
     }
-#endif
 
     if (av_qsv_list_count(qsv->dts_seq)) {
         item = av_qsv_list_item(qsv->dts_seq, 0);
         av_qsv_list_rem(qsv->dts_seq, item);
         av_free(item);
     }
-#if HAVE_THREADS
     if (qsv && qsv->qts_seq_mutex){
         mut_ret = pthread_mutex_unlock(qsv->qts_seq_mutex);
         if(mut_ret)
             av_log(NULL, AV_LOG_ERROR, "pthread_mutex_lock issue[%d] at %s\n",mut_ret, __FUNCTION__);
         }
-#endif
 }
 
 
 av_qsv_list *av_qsv_list_init(int is_threaded)
 {
     av_qsv_list *l;
-#if HAVE_THREADS
     int mut_ret;
-#endif
 
     l = av_mallocz(sizeof(av_qsv_list));
     if (!l)
@@ -449,7 +417,6 @@ av_qsv_list *av_qsv_list_init(int is_threaded)
         return 0;
     l->items_alloc = AV_QSV_JOB_SIZE_DEFAULT;
 
-#if HAVE_THREADS
     if (is_threaded) {
         l->mutex = av_mallocz(sizeof(pthread_mutex_t));
         if (l->mutex){
@@ -464,7 +431,6 @@ av_qsv_list *av_qsv_list_init(int is_threaded)
                 av_log(NULL, AV_LOG_ERROR, "pthread_mutex_init issue[%d] at %s\n",mut_ret, __FUNCTION__);
         }
     } else
-#endif
         l->mutex = 0;
     return l;
 }
@@ -566,15 +532,12 @@ void av_qsv_list_insert(av_qsv_list * l, int pos, void *p)
 void av_qsv_list_close(av_qsv_list ** _l)
 {
     av_qsv_list *l = *_l;
-#if HAVE_THREADS
     int mut_ret;
-#endif
 
     av_qsv_list_lock(l);
 
     av_free(l->items);
 
-#if HAVE_THREADS
     if (l->mutex){
         mut_ret = pthread_mutex_unlock(l->mutex);
         if( mut_ret )
@@ -582,31 +545,26 @@ void av_qsv_list_close(av_qsv_list ** _l)
         mut_ret = pthread_mutex_destroy(&l->mutex);
         mut_ret = pthread_mutexattr_destroy(&l->mta);
     }
-#endif
     av_freep(_l);
 }
 
 int av_qsv_list_lock(av_qsv_list *l){
     int ret = 0;
-#if HAVE_THREADS
     if (l->mutex){
         ret = pthread_mutex_lock(l->mutex);
         if( ret )
             av_log(NULL, AV_LOG_ERROR, "pthread_mutex_lock issue[%d] at %s\n",ret, __FUNCTION__);
     }
-#endif
     return ret;
 }
 
 int av_qsv_list_unlock(av_qsv_list *l){
     int ret = 0;
-#if HAVE_THREADS
     if (l->mutex){
         ret = pthread_mutex_unlock(l->mutex);
         if( ret )
             av_log(NULL, AV_LOG_ERROR, "pthread_mutex_unlock issue[%d] at %s\n",ret, __FUNCTION__);
     }
-#endif
     return ret;
 }
 
@@ -643,4 +601,6 @@ void av_qsv_wait_on_sync(av_qsv_context *qsv, av_qsv_stage *stage)
                 break;
             }
         }
-}
\ No newline at end of file
+}
+
+#endif // USE_QSV
index 971e6a4b32cc618360732c08868fcd5ad4d3b299..bd6caf7edd72286ff7334e3f831c044d97eaf01d 100644 (file)
@@ -26,8 +26,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 \* ********************************************************************* */
 
-#ifndef AVCODEC_QSV_H
-#define AVCODEC_QSV_H
+#ifndef HB_QSV_LIBAV_H
+#define HB_QSV_LIBAV_H
 
 /**
  * @file
@@ -120,11 +120,6 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "libavutil/mem.h"
 #include "libavutil/time.h"
 
-#ifdef HAVE_AV_CONFIG_H
-#include "config.h"
-#endif
-
-#if HAVE_THREADS
 #if defined (__GNUC__)
 #include <pthread.h>
 #define ff_qsv_atomic_inc(ptr) __sync_add_and_fetch(ptr,1)
@@ -138,13 +133,6 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #endif
 #define ff_qsv_atomic_inc(ptr) InterlockedIncrement(ptr)
 #define ff_qsv_atomic_dec(ptr) InterlockedDecrement (ptr)
-#else
-// targeting only for MinGW or MSVC
-#endif
-
-#else
-#define ff_qsv_atomic_inc(ptr) ((*ptr)++)
-#define ff_qsv_atomic_dec(ptr) ((*ptr)--)
 #endif
 
 
@@ -202,9 +190,7 @@ typedef enum AV_QSV_STAGE_TYPE {
 typedef struct av_qsv_list {
     // practically pthread_mutex_t
     void *mutex;
-#if HAVE_THREADS
     pthread_mutexattr_t   mta;
-#endif
 
     void **items;
     int items_alloc;
@@ -491,4 +477,4 @@ void *av_qsv_list_item(av_qsv_list *, int);
 
 /* @} */
 
-#endif                          //AVCODEC_QSV_H
+#endif // HB_QSV_LIBAV_H
index b2a5b0302f15162dba28127dfa52127c543583e0..397f9593149053481d31aea903940d0b4ef731d2 100644 (file)
@@ -29,8 +29,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #ifndef QSV_MEMORY_H
 #define QSV_MEMORY_H
 
-#include "libavcodec/qsv.h"
 #include "mfx/mfxplugin.h"
+#include "qsv_libav.h"
 
 typedef struct{