fix 32bit video format copy error 37/324037/1
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 10:40:09 +0000 (19:40 +0900)
[Version] 0.1.7
- 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 6c471b7bf542f6080eee9e091672ff3248c65fee..bb358be41492e08097942264bb969b94e9775d61 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libtrackrenderer
 Summary:    new multimedia streaming player trackrenderer
-Version:    0.1.6
+Version:    0.1.7
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 36dea8be0911be58f061910808b745020b7b0ad2..2d5e04275ef82b74749742d5bfa5ad86217dd1a0 100644 (file)
@@ -153,7 +153,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;
@@ -168,6 +168,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");
@@ -234,7 +235,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:
@@ -271,8 +272,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);
@@ -1725,7 +1736,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) {
@@ -1773,7 +1784,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) {
@@ -3039,7 +3050,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;