]> granicus.if.org Git - handbrake/commitdiff
qsv: added HEVC 10-bit as encoder, should help for GUI integration
authormaxd <maxim.d33@gmail.com>
Tue, 28 Feb 2017 17:15:00 +0000 (18:15 +0100)
committerBradley Sepos <bradley@bradleysepos.com>
Sun, 5 Mar 2017 17:06:11 +0000 (12:06 -0500)
libhb/common.c
libhb/common.h
libhb/muxavformat.c
libhb/qsv_common.c
libhb/work.c

index 043205d0a0b7e0f6211954337d70e5e27b0628bb..8d7cc7fd976d79d153b440f6e6e4d0a53b1e4176 100644 (file)
@@ -241,6 +241,7 @@ hb_encoder_internal_t hb_video_encoders[]  =
     { { "H.265 12-bit (x265)", "x265_12bit", "H.265 12-bit (libx265)",  HB_VCODEC_X265_12BIT,     HB_MUX_AV_MP4|HB_MUX_AV_MKV,   }, NULL, 1, HB_GID_VCODEC_H265,   },
     { { "H.265 16-bit (x265)", "x265_16bit", "H.265 16-bit (libx265)",  HB_VCODEC_X265_16BIT,     HB_MUX_AV_MP4|HB_MUX_AV_MKV,   }, NULL, 1, HB_GID_VCODEC_H265,   },
     { { "H.265 (Intel QSV)",   "qsv_h265",   "H.265 (Intel Media SDK)", HB_VCODEC_QSV_H265,     HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_H265,   },
+    { { "H.265 10-bit (Intel QSV)",   "qsv_h265_10bit",   "H.265 10-bit (Intel Media SDK)", HB_VCODEC_QSV_H265_10BIT,     HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_H265,   },
     { { "MPEG-4",              "mpeg4",      "MPEG-4 (libavcodec)",     HB_VCODEC_FFMPEG_MPEG4, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_MPEG4,  },
     { { "MPEG-2",              "mpeg2",      "MPEG-2 (libavcodec)",     HB_VCODEC_FFMPEG_MPEG2, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_MPEG2,  },
     { { "VP8",                 "VP8",        "VP8 (libvpx)",            HB_VCODEC_FFMPEG_VP8,                   HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_VP8,    },
@@ -1370,6 +1371,9 @@ int hb_video_encoder_get_depth(int encoder)
 {
     switch (encoder)
     {
+#ifdef USE_QSV
+        case HB_VCODEC_QSV_H265_10BIT:
+#endif
         case HB_VCODEC_X264_10BIT:
         case HB_VCODEC_X265_10BIT:
             return 10;
index 4d7c548b343c5719b46b277d5f6fd3a4cf59bc3d..dc7ebb3ea47eda08573918ba1293224b3437e768 100644 (file)
@@ -504,7 +504,10 @@ struct hb_job_s
 #define HB_VCODEC_FFMPEG_VP9   0x0000080
 #define HB_VCODEC_FFMPEG_MASK  0x00000F0
 #define HB_VCODEC_QSV_H264     0x0000100
-#define HB_VCODEC_QSV_H265     0x0000200
+#define HB_VCODEC_QSV_H265_8BIT     0x0000200
+#define HB_VCODEC_QSV_H265_10BIT    0x0000400
+#define HB_VCODEC_QSV_H265_MASK     0x0000600
+#define HB_VCODEC_QSV_H265     HB_VCODEC_QSV_H265_8BIT
 #define HB_VCODEC_QSV_MASK     0x0000F00
 #define HB_VCODEC_X264_8BIT    0x0010000
 #define HB_VCODEC_X264         HB_VCODEC_X264_8BIT
@@ -517,7 +520,7 @@ struct hb_job_s
 #define HB_VCODEC_X265_12BIT   0x0004000
 #define HB_VCODEC_X265_16BIT   0x0008000
 #define HB_VCODEC_X265_MASK    0x000F000
-#define HB_VCODEC_H265_MASK    (HB_VCODEC_X265_MASK|HB_VCODEC_QSV_H265)
+#define HB_VCODEC_H265_MASK    (HB_VCODEC_X265_MASK|HB_VCODEC_QSV_H265_MASK)
 
 /* define an invalid CQ value compatible with all CQ-capable codecs */
 #define HB_INVALID_VIDEO_QUALITY (-1000.)
index 6c56f8a5f7573f80103d8ac967dd4592e5fa7ca1..2982ab7d33443f675e4f8f6e4d947c80403ac8fe 100644 (file)
@@ -330,6 +330,7 @@ static int avformatInit( hb_mux_object_t * m )
         case HB_VCODEC_X265_12BIT:
         case HB_VCODEC_X265_16BIT:
         case HB_VCODEC_QSV_H265:
+        case HB_VCODEC_QSV_H265_10BIT:
             track->st->codecpar->codec_id = AV_CODEC_ID_HEVC;
 
             if (job->config.h265.headers_length > 0)
index cef1990924aae0a7302882965e66f26825d6c0dd..6ce6be983471960540f6e954c3d3bbe824446869 100644 (file)
@@ -148,7 +148,8 @@ static int qsv_implementation_is_hardware(mfxIMPL implementation)
 int hb_qsv_available()
 {
     return ((hb_qsv_video_encoder_is_enabled(HB_VCODEC_QSV_H264) ? HB_VCODEC_QSV_H264 : 0) |
-            (hb_qsv_video_encoder_is_enabled(HB_VCODEC_QSV_H265) ? HB_VCODEC_QSV_H265 : 0));
+            (hb_qsv_video_encoder_is_enabled(HB_VCODEC_QSV_H265) ? HB_VCODEC_QSV_H265 : 0) |
+            (hb_qsv_video_encoder_is_enabled(HB_VCODEC_QSV_H265_10BIT) ? HB_VCODEC_QSV_H265_10BIT : 0));
 }
 
 int hb_qsv_video_encoder_is_enabled(int encoder)
@@ -157,6 +158,9 @@ int hb_qsv_video_encoder_is_enabled(int encoder)
     {
         case HB_VCODEC_QSV_H264:
             return hb_qsv_info_avc != NULL && hb_qsv_info_avc->available;
+        case HB_VCODEC_QSV_H265_10BIT:
+            if (qsv_hardware_generation(hb_get_cpu_platform()) < QSV_G6)
+                return 0;
         case HB_VCODEC_QSV_H265:
             return hb_qsv_info_hevc != NULL && hb_qsv_info_hevc->available;
         default:
@@ -811,7 +815,7 @@ void hb_qsv_info_print()
         }
         if (hb_qsv_info_hevc != NULL && hb_qsv_info_hevc->available)
         {
-            hb_log(" - H.265 encoder: yes");
+            hb_log(" - H.265 encoder: yes (8bit: yes, 10bit: %s)", (qsv_hardware_generation(hb_get_cpu_platform()) < QSV_G6) ? "no" : "yes" );
             hb_log("    - preferred implementation: %s",
                    hb_qsv_impl_get_name(hb_qsv_info_hevc->implementation));
             if (qsv_hardware_info_hevc.available)
@@ -838,6 +842,7 @@ hb_qsv_info_t* hb_qsv_info_get(int encoder)
     {
         case HB_VCODEC_QSV_H264:
             return hb_qsv_info_avc;
+        case HB_VCODEC_QSV_H265_10BIT:
         case HB_VCODEC_QSV_H265:
             return hb_qsv_info_hevc;
         default:
@@ -1547,7 +1552,7 @@ int hb_qsv_profile_parse(hb_qsv_param_t *param, hb_qsv_info_t *info, const char
                 if (profile->value == MFX_PROFILE_HEVC_MAIN10 &&
                     qsv_hardware_generation(hb_get_cpu_platform()) < QSV_G6)
                 {
-                    hb_log("HEVC Main10 is not supported on this platform");
+                    hb_log("qsv: HEVC Main10 is not supported on this platform");
                     profile = NULL;
                 }
 
@@ -1625,8 +1630,10 @@ const char* const* hb_qsv_profile_get_names(int encoder)
     {
         case HB_VCODEC_QSV_H264:
             return hb_h264_profile_names_8bit;
-        case HB_VCODEC_QSV_H265:
+        case HB_VCODEC_QSV_H265_8BIT:
             return hb_h265_profile_names_8bit;
+        case HB_VCODEC_QSV_H265_10BIT:
+            return hb_h265_profile_names_10bit;
         default:
             return NULL;
     }
@@ -1638,6 +1645,7 @@ const char* const* hb_qsv_level_get_names(int encoder)
     {
         case HB_VCODEC_QSV_H264:
             return hb_h264_level_names;
+        case HB_VCODEC_QSV_H265_10BIT:
         case HB_VCODEC_QSV_H265:
             return hb_h265_level_names;
         default:
@@ -1654,6 +1662,7 @@ const char* hb_qsv_video_quality_get_name(uint32_t codec)
             if (hb_qsv_info_avc != NULL) caps = hb_qsv_info_avc->capabilities;
             break;
 
+        case HB_VCODEC_QSV_H265_10BIT:
         case HB_VCODEC_QSV_H265:
             if (hb_qsv_info_hevc != NULL) caps = hb_qsv_info_hevc->capabilities;
             break;
@@ -1670,6 +1679,7 @@ void hb_qsv_video_quality_get_limits(uint32_t codec, float *low, float *high,
     uint64_t caps = 0;
     switch (codec)
     {
+        case HB_VCODEC_QSV_H265_10BIT:
         case HB_VCODEC_QSV_H265:
             if (hb_qsv_info_hevc != NULL) caps = hb_qsv_info_hevc->capabilities;
             *direction   = 1;
index 831f83a8b253393e39c74af5aa249d839ae55ae2..5af53cb5df5ebb6bedb86685546f93ca04ab1349 100644 (file)
@@ -231,6 +231,7 @@ hb_work_object_t* hb_video_encoder(hb_handle_t *h, int vcodec)
             break;
         case HB_VCODEC_QSV_H264:
         case HB_VCODEC_QSV_H265:
+        case HB_VCODEC_QSV_H265_10BIT:
             w = hb_get_work(h, WORK_ENCQSV);
             break;
         case HB_VCODEC_THEORA:
@@ -466,6 +467,7 @@ void hb_display_job_info(hb_job_t *job)
                 case HB_VCODEC_X265_16BIT:
                 case HB_VCODEC_QSV_H264:
                 case HB_VCODEC_QSV_H265:
+                case HB_VCODEC_QSV_H265_10BIT:
                     hb_log("     + profile: %s", job->encoder_profile);
                 default:
                     break;
@@ -479,6 +481,7 @@ void hb_display_job_info(hb_job_t *job)
                 case HB_VCODEC_X264_10BIT:
                 case HB_VCODEC_QSV_H264:
                 case HB_VCODEC_QSV_H265:
+                case HB_VCODEC_QSV_H265_10BIT:
                     hb_log("     + level:   %s", job->encoder_level);
                 default:
                     break;