]> granicus.if.org Git - handbrake/commitdiff
libhb: add DXVA2-accelerated HEVC decoding.
authorRodeo <tdskywalker@gmail.com>
Tue, 23 Jun 2015 16:21:18 +0000 (16:21 +0000)
committerRodeo <tdskywalker@gmail.com>
Tue, 23 Jun 2015 16:21:18 +0000 (16:21 +0000)
Patch by Zhang Zhiqiang. Thanks!

git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@7308 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/common.c
libhb/common.h
libhb/vadxva2.c
libhb/vadxva2.h

index 6b78594617eb4bd586f336129fdd9ea308bb5a23..8cc1dc65dd758fce04737cfb42860b86308bf6cb 100644 (file)
@@ -4539,7 +4539,8 @@ int hb_use_dxva( hb_title_t * title )
               || title->video_codec_param == AV_CODEC_ID_H264
               || title->video_codec_param == AV_CODEC_ID_VC1
               || title->video_codec_param == AV_CODEC_ID_WMV3
-              || title->video_codec_param == AV_CODEC_ID_MPEG4 )
+              || title->video_codec_param == AV_CODEC_ID_MPEG4 
+              || title->video_codec_param == AV_CODEC_ID_HEVC )
              && title->opaque_priv );
 }
 
index 158ade2470a3e1d10b3feb614d64e9db5e09baf6..76bff6a2ece836296f585afe6b9ebb4758baff50 100644 (file)
@@ -70,6 +70,8 @@
 
 #define HB_DVD_READ_BUFFER_SIZE 2048
 
+#define HBALIGN(x, a) (((x)+(a)-1)&~((a)-1))
+
 typedef struct hb_handle_s hb_handle_t;
 typedef struct hb_hwd_s hb_hwd_t;
 typedef struct hb_list_s hb_list_t;
index 6ea0cad9b3e0eafe19d2786ec1c1c0b80abf6424..3c1dc0cf34b91aa4198849144bd1bdbf43c5e22f 100644 (file)
@@ -124,19 +124,33 @@ void hb_va_close( hb_va_dxva2_t *dxva2 )
  */
 static int hb_dx_create_video_decoder( hb_va_dxva2_t *dxva2, int codec_id, const  hb_title_t* fmt )
 {
+    int surface_alignment;
     dxva2->width = fmt->geometry.width;
     dxva2->height = fmt->geometry.height;
-    dxva2->surface_width = (fmt->geometry.width  + 15) & ~15;
-    dxva2->surface_height = (fmt->geometry.height + 15) & ~15;
+
     switch( codec_id )
     {
         case AV_CODEC_ID_H264:
             dxva2->surface_count = 16 + 1;
+            surface_alignment = 16;
+            break;
+        case AV_CODEC_ID_HEVC:
+            dxva2->surface_count = 16 + 1;
+            surface_alignment = 128;
+            break;
+        case AV_CODEC_ID_MPEG2VIDEO:
+            dxva2->surface_count = 2 + 1;
+            surface_alignment = 32;
             break;
         default:
             dxva2->surface_count = 2 + 1;
+            surface_alignment = 16;
             break;
     }
+    
+    dxva2->surface_width = HBALIGN(fmt->geometry.width, surface_alignment);
+    dxva2->surface_height = HBALIGN(fmt->geometry.height, surface_alignment);    
+    
     LPDIRECT3DSURFACE9 surface_list[VA_DXVA2_MAX_SURFACE_COUNT];
     if( FAILED( IDirectXVideoDecoderService_CreateSurface( dxva2->vs,
                                                            dxva2->surface_width,
index 9f0e19705764c91a8e9e64c369e755c623672df6..d095d0c931e42e91c3777bc7bb51d44de3a7707d 100644 (file)
@@ -57,6 +57,7 @@ static const GUID DXVA2_ModeVC1_A = { 0x1b81beA0, 0xa0c7, 0x11d3, {0xb9, 0x84, 0
 static const GUID DXVA2_ModeVC1_B = { 0x1b81beA1, 0xa0c7, 0x11d3, {0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5} };
 static const GUID DXVA2_ModeVC1_C = { 0x1b81beA2, 0xa0c7, 0x11d3, {0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5} };
 static const GUID DXVA2_ModeVC1_D = { 0x1b81beA3, 0xa0c7, 0x11d3, {0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5} };
+static const GUID DXVA2_ModeHEVC_VLD_Main = { 0x5b11d51b, 0x2f4c,0x4452, {0xbc, 0xc3, 0x09, 0xf2, 0xa1, 0x16, 0x0c, 0xc0} };
 
 typedef struct
 {
@@ -187,6 +188,8 @@ static const hb_dx_mode_t dxva2_modes[] =
     { "VC-1 IDCT",            &DXVA2_ModeVC1_C, 0 },
     { "VC-1 MoComp",          &DXVA2_ModeVC1_B, 0 },
     { "VC-1 post processing", &DXVA2_ModeVC1_A, 0 },
+    
+    { "DXVA2_ModeHEVC_VLD_Main", &DXVA2_ModeHEVC_VLD_Main,  AV_CODEC_ID_HEVC },
 
     { NULL, NULL, 0 }
 };