}
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;
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");
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:
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);
}
} 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) {
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) {
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;