vl/video_buffer: fix up surface ordering for the interlaced case
authorMaarten Lankhorst <maarten.lankhorst@canonical.com>
Tue, 18 Dec 2012 12:17:22 +0000 (13:17 +0100)
committerMaarten Lankhorst <maarten.lankhorst@canonical.com>
Wed, 16 Jan 2013 16:22:55 +0000 (17:22 +0100)
It seems the other code expects surface[0..1] to be the luma field in interlaced case.

See for example vdpau/surface.c vlVdpVideoSurfaceClear and vlVdpVideoSurfacePutBitsYCbCr.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
src/gallium/auxiliary/vl/vl_video_buffer.c

index 511485f75d6b87f7d798be76119b8561c9122c36..d61dab22c2d89406e29dc31964fbd265c9e5f75d 100644 (file)
@@ -356,20 +356,20 @@ vl_video_buffer_surfaces(struct pipe_video_buffer *buffer)
    pipe = buf->base.context;
 
    depth = buffer->interlaced ? 2 : 1;
-   for (i = 0, surf = 0; i < depth; ++i ) {
-      for (j = 0; j < VL_NUM_COMPONENTS; ++j, ++surf) {
+   for (i = 0, surf = 0; i < VL_NUM_COMPONENTS; ++i) {
+      for (j = 0; j < depth; ++j, ++surf) {
          assert(surf < (VL_NUM_COMPONENTS * 2));
 
-         if (!buf->resources[j]) {
+         if (!buf->resources[i]) {
             pipe_surface_reference(&buf->surfaces[surf], NULL);
             continue;
          }
 
          if (!buf->surfaces[surf]) {
             memset(&surf_templ, 0, sizeof(surf_templ));
-            surf_templ.format = vl_video_buffer_surface_format(buf->resources[j]->format);
-            surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = i;
-            buf->surfaces[surf] = pipe->create_surface(pipe, buf->resources[j], &surf_templ);
+            surf_templ.format = vl_video_buffer_surface_format(buf->resources[i]->format);
+            surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = j;
+            buf->surfaces[surf] = pipe->create_surface(pipe, buf->resources[i], &surf_templ);
             if (!buf->surfaces[surf])
                goto error;
          }