]> git.sesse.net Git - vlc/commitdiff
Allocated mod16 D3D surfaces.
authorLaurent Aimar <fenrir@videolan.org>
Sat, 26 Jun 2010 19:55:20 +0000 (21:55 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Sun, 27 Jun 2010 17:03:19 +0000 (19:03 +0200)
It seems necessary for ATI(?) dxva2 support.

modules/codec/avcodec/dxva2.c

index 50c1bd5f9af783105cd0223f9b3aa2f780b36c84..dc8a2aed73cccfdb081536804c4c84944b72d035 100644 (file)
@@ -227,6 +227,8 @@ typedef struct
     /* */
     vlc_object_t *log;
     int          codec_id;
+    int          width;
+    int          height;
 
     /* DLL */
        HINSTANCE             hd3d9_dll;
@@ -303,8 +305,7 @@ static int Setup(vlc_va_t *external, void **hw, vlc_fourcc_t *chroma,
 {
     vlc_va_dxva2_t *va = vlc_va_dxva2_Get(external);
 
-    if (va->surface_width  == width &&
-        va->surface_height == height)
+    if (va->width == width && va->height == height && va->decoder)
         goto ok;
 
     /* */
@@ -375,7 +376,7 @@ static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff)
             lock.Pitch / 2,
         };
         CopyFromYv12(picture, plane, pitch,
-                     va->surface_width, va->surface_height,
+                     va->width, va->height,
                      &va->surface_cache);
     } else {
         assert(va->render == MAKEFOURCC('N','V','1','2'));
@@ -388,7 +389,7 @@ static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff)
             lock.Pitch,
         };
         CopyFromNv12(picture, plane, pitch,
-                     va->surface_width, va->surface_height,
+                     va->width, va->height,
                      &va->surface_cache);
     }
 
@@ -826,7 +827,12 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va,
     msg_Dbg(va->log, "DxCreateVideoDecoder id %d %dx%d",
             codec_id, fmt->i_width, fmt->i_height);
 
+    va->width  = fmt->i_width;
+    va->height = fmt->i_height;
+
     /* Allocates all surfaces needed for the decoder */
+    va->surface_width  = (fmt->i_width  + 15) & ~15;
+    va->surface_height = (fmt->i_height + 15) & ~15;
     switch (codec_id) {
     case CODEC_ID_H264:
         va->surface_count = 16 + 1;
@@ -837,8 +843,8 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va,
     }
     LPDIRECT3DSURFACE9 surface_list[VA_DXVA2_MAX_SURFACE_COUNT];
     if (FAILED(IDirectXVideoDecoderService_CreateSurface(va->vs,
-                                                         fmt->i_width,
-                                                         fmt->i_height,
+                                                         va->surface_width,
+                                                         va->surface_height,
                                                          va->surface_count - 1,
                                                          va->render,
                                                          D3DPOOL_DEFAULT,
@@ -856,8 +862,6 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va,
         surface->refcount = 0;
         surface->order = 0;
     }
-    va->surface_width  = fmt->i_width;
-    va->surface_height = fmt->i_height;
     msg_Dbg(va->log, "IDirectXVideoAccelerationService_CreateSurface succeed with %d surfaces (%dx%d)",
             va->surface_count, fmt->i_width, fmt->i_height);