msdk: return the right pointer
authorHaihao Xiang <haihao.xiang@intel.com>
Wed, 9 Oct 2019 06:00:01 +0000 (14:00 +0800)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Fri, 11 Oct 2019 14:07:17 +0000 (14:07 +0000)
The first channel in memory for MFX_FOURCC_RGB4 (VA_FOURCC_ARGB or
GST_VIDEO_FORMAT_BGRA) is B, not A. In MSDK, channle B is used to access
data for RGB4 surface. In addition, the returned pointers for
MFX_FOURCC_AYUV and MFX_FOURCC_Y410 in gst_msdk_video_memory_map_full
were wrong too before this fix.

sys/msdk/gstmsdkallocator_libva.c
sys/msdk/gstmsdksystemmemory.c
sys/msdk/gstmsdkvideomemory.c

index 3ddcbb8b208e36128e558185207b3e92c74cb25c..af1243dcc24ca0703a7e45b4db07b395933c0faa 100644 (file)
@@ -343,10 +343,10 @@ gst_msdk_frame_lock (mfxHDL pthis, mfxMemId mid, mfxFrameData * data)
         break;
       case VA_FOURCC_ARGB:
         data->Pitch = mem_id->image.pitches[0];
-        data->R = buf + mem_id->image.offsets[0];
-        data->G = data->R + 1;
-        data->B = data->R + 2;
-        data->A = data->R + 3;
+        data->B = buf + mem_id->image.offsets[0];
+        data->G = data->B + 1;
+        data->R = data->B + 2;
+        data->A = data->B + 3;
         break;
 #if (MFX_VERSION >= 1028)
       case VA_FOURCC_RGB565:
index 80f689f1b59baeca574175641bdb9dfc1c732a0d..74bac7262758b6f67c0962947e66a72ffa31299a 100644 (file)
@@ -109,9 +109,10 @@ ensure_data (GstMsdkSystemMemory * mem)
       mem->surface->Data.Pitch = mem->destination_pitches[0];
       break;
     case GST_VIDEO_FORMAT_BGRA:
-      mem->surface->Data.R = mem->cached_data[0];
-      mem->surface->Data.G = mem->surface->Data.R + 1;
-      mem->surface->Data.B = mem->surface->Data.R + 2;
+      mem->surface->Data.B = mem->cached_data[0];
+      mem->surface->Data.G = mem->surface->Data.B + 1;
+      mem->surface->Data.R = mem->surface->Data.B + 2;
+      mem->surface->Data.A = mem->surface->Data.B + 3;
       mem->surface->Data.Pitch = mem->destination_pitches[0];
       break;
 #if (MFX_VERSION >= 1028)
@@ -237,15 +238,22 @@ gst_msdk_system_memory_map_full (GstMemory * base_mem, GstMapInfo * info,
     return NULL;
   }
 
-  /* The first channel in memory is V for MFX_FOURCC_AYUV (GST_VIDEO_FORMAT_VUYA) format */
-  if (mem->surface->Info.FourCC == MFX_FOURCC_AYUV)
-    return mem->surface->Data.V;
+  switch (mem->surface->Info.FourCC) {
+    case MFX_FOURCC_RGB4:
+      return mem->surface->Data.B;      /* The first channel is B */
+
+      /* The first channel in memory is V for MFX_FOURCC_AYUV (GST_VIDEO_FORMAT_VUYA) format */
+    case MFX_FOURCC_AYUV:
+      return mem->surface->Data.V;
+
 #if (MFX_VERSION >= 1027)
-  else if (mem->surface->Info.FourCC == MFX_FOURCC_Y410)
-    return mem->surface->Data.U;        /* Data.Y410 */
+    case MFX_FOURCC_Y410:
+      return mem->surface->Data.U;      /* Data.Y410 */
 #endif
-  else
-    return mem->surface->Data.Y;
+
+    default:
+      return mem->surface->Data.Y;
+  }
 }
 
 static void
index 21d4981837c055ffb2aac34148e6f6c7304ab47c..5fc536988b728d118f274db272dff44279c1fe6a 100644 (file)
@@ -237,15 +237,26 @@ gst_video_meta_map_msdk_memory (GstVideoMeta * meta, guint plane,
   pitch = mem_id->pitch;
 #endif
 
-  /* The first channel in memory is V for GST_VIDEO_FORMAT_VUYA */
-  if (meta->format == GST_VIDEO_FORMAT_VUYA)
-    *data = mem->surface->Data.V + offset;
-  else if (meta->format == GST_VIDEO_FORMAT_Y410)
-    *data = mem->surface->Data.U + offset;      /* Data.Y410 */
-  else
-    *data = mem->surface->Data.Y + offset;
-  *stride = pitch;
+  switch (meta->format) {
+    case GST_VIDEO_FORMAT_BGRA:
+      *data = mem->surface->Data.B + offset;
+      break;
+
+      /* The first channel in memory is V for GST_VIDEO_FORMAT_VUYA */
+    case GST_VIDEO_FORMAT_VUYA:
+      *data = mem->surface->Data.V + offset;
+      break;
+
+    case GST_VIDEO_FORMAT_Y410:
+      *data = mem->surface->Data.U + offset;    /* Data.Y410 */
+      break;
+
+    default:
+      *data = mem->surface->Data.Y + offset;
+      break;
+  }
 
+  *stride = pitch;
   info->flags = flags;
   ret = (*data != NULL);
 
@@ -300,7 +311,23 @@ gst_msdk_video_memory_map_full (GstMemory * base_mem, GstMapInfo * info,
 
   gst_msdk_frame_lock (msdk_video_allocator->context, mem->surface->Data.MemId,
       &mem->surface->Data);
-  return mem->surface->Data.Y;
+
+  switch (mem->surface->Info.FourCC) {
+    case MFX_FOURCC_RGB4:
+      return mem->surface->Data.B;      /* The first channel is B */
+
+      /* The first channel in memory is V for MFX_FOURCC_AYUV (GST_VIDEO_FORMAT_VUYA) format */
+    case MFX_FOURCC_AYUV:
+      return mem->surface->Data.V;
+
+#if (MFX_VERSION >= 1027)
+    case MFX_FOURCC_Y410:
+      return mem->surface->Data.U;      /* Data.Y410 */
+#endif
+
+    default:
+      return mem->surface->Data.Y;
+  }
 }
 
 static void