fix 32bit video format copy error 18/324018/2
authorEunhye Choi <eunhae1.choi@samsung.com>
Mon, 7 Apr 2025 06:49:01 +0000 (15:49 +0900)
committerEunhye Choi <eunhae1.choi@samsung.com>
Mon, 12 May 2025 09:01:27 +0000 (18:01 +0900)
[Version] 0.0.57
- bo size can be different from decoded video size
- consider the source and destination stride for frame copy

Change-Id: Ia8f2398e2f04612b1ab1a99a0b0580623c84141a

packaging/libtrackrenderer.spec
src/trackrenderer.cpp

index a11c08223cd6ece4ce0c6e6484ae0aaf4ad35cec..41d2b00e33b87a931a6f62dd647f2a54120d11a0 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libtrackrenderer
 Summary:    new multimedia streaming player trackrenderer
-Version:    0.0.56
+Version:    0.0.57
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 6f8728b079123ce0ba94b0306e6799c3568d5db4..79fe53a7244a74e95c60d9c412a4b1f6dd21e056 100644 (file)
@@ -210,7 +210,7 @@ uint32_t ConvertToTbmFormat(const gchar *data) {
 }
 
 constexpr int kMaxPlane = 4;
-tbm_surface_h CreateTbmSurfaceWithBuffer(GstMemory* mem, GstCaps* caps) {
+tbm_surface_h CreateTbmSurfaceWithBuffer(GstBuffer* buffer, GstCaps* caps) {
 
   int width = 0;
   int height = 0;
@@ -225,6 +225,7 @@ tbm_surface_h CreateTbmSurfaceWithBuffer(GstMemory* mem, GstCaps* caps) {
     return nullptr;
   }
 
+  GstMemory* mem = gst_buffer_peek_memory(buffer, 0);
   bool is_mapped = gst_memory_map(mem, &mapinfo, GST_MAP_READWRITE);
   if (!is_mapped) {
     TRACKRENDERER_ERROR("gst_memory_map fail");
@@ -291,7 +292,7 @@ tbm_surface_h CreateTbmSurfaceWithBuffer(GstMemory* mem, GstCaps* caps) {
   unsigned char *src = NULL;
   unsigned char *dest = NULL;
 
-  TRACKRENDERER_ERROR("width %d, height %d, bo_size %d", width, height, bo_size);
+  TRACKRENDERER_INFO("width %d, height %d, size %" G_GSIZE_FORMAT ", bo_size %d", width, height, mapinfo.size, bo_size);
 
   switch(bo_format) {
   case TBM_FORMAT_YUV420:
@@ -328,8 +329,18 @@ tbm_surface_h CreateTbmSurfaceWithBuffer(GstMemory* mem, GstCaps* caps) {
   case TBM_FORMAT_BGRA8888:
   case TBM_FORMAT_BGRX8888:
   case TBM_FORMAT_ARGB8888:
-    memcpy(thandle.ptr, mapinfo.data, bo_size);
-    break;
+  {
+    GstVideoMeta *vmeta = gst_buffer_get_video_meta(buffer);
+    int src_stride = (vmeta) ? (vmeta->stride[0]) : (width * 4);
+    int dest_stride = info.planes[0].stride;
+
+    for (i = 0; i < height; i++) {
+      dest = (unsigned char*)(thandle.ptr) + (i * dest_stride);
+      src = mapinfo.data + (i * src_stride);
+      memcpy(dest, src, width * 4);
+    }
+  }
+  break;
   default:
     TRACKRENDERER_ERROR("not supported format");
     tbm_surface_destroy(tbm_surf);
@@ -1783,7 +1794,7 @@ void TrackRenderer::GstDecodedVideoBufferCb_(GstElement* element,
     }
   } else {
     auto caps = gstguard::make_guard(gst_pad_get_current_caps(pad));
-    tbm_surf = internal::CreateTbmSurfaceWithBuffer(mem, caps.get());
+    tbm_surf = internal::CreateTbmSurfaceWithBuffer(buffer, caps.get());
   }
 
   if (!tbm_surf) {
@@ -1831,7 +1842,7 @@ void TrackRenderer::GstEvasRenderVideoBufferCb_(GstElement* element,
     tbm_surface_internal_ref(tbm_surf);
   } else {
     auto caps = gstguard::make_guard(gst_pad_get_current_caps(pad));
-    tbm_surf = internal::CreateTbmSurfaceWithBuffer(mem, caps.get());
+    tbm_surf = internal::CreateTbmSurfaceWithBuffer(buffer, caps.get());
   }
 
   if (!tbm_surf) {
@@ -3089,7 +3100,7 @@ GetDecodedVideoFrameState TrackRenderer::GetDecodedPacket(
     tbm_surf = internal::CopyTbmSurface(static_cast<tbm_surface_h>(gst_tizen_memory_get_surface(mem)));
   } else {
     auto caps = gstguard::make_guard(pipeline_->GetSinkPadCaps(Elements::kSinkVideo));
-    tbm_surf = internal::CreateTbmSurfaceWithBuffer(mem, caps.get());
+    tbm_surf = internal::CreateTbmSurfaceWithBuffer(buffer, caps.get());
   }
   packet.buffer_addr = nullptr;