From: Eunhye Choi Date: Mon, 7 Apr 2025 06:49:01 +0000 (+0900) Subject: fix 32bit video format copy error X-Git-Tag: accepted/tizen/9.0/unified/20250513.131752~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dc8bd22472582665a65a11234532a2e63111db5e;p=platform%2Fcore%2Fmultimedia%2Ftrackrenderer.git fix 32bit video format copy error [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 --- diff --git a/packaging/libtrackrenderer.spec b/packaging/libtrackrenderer.spec index 6c471b7..bb358be 100644 --- a/packaging/libtrackrenderer.spec +++ b/packaging/libtrackrenderer.spec @@ -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 diff --git a/src/trackrenderer.cpp b/src/trackrenderer.cpp index 36dea8b..2d5e042 100644 --- a/src/trackrenderer.cpp +++ b/src/trackrenderer.cpp @@ -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(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;