return tbm_surf;
}
+tbm_surface_h CopyTbmSurface(tbm_surface_h tsurf_origin) {
+
+ TRACKRENDERER_ENTER;
+
+ if (!tsurf_origin) {
+ TRACKRENDERER_ERROR("tsurf_origin is null");
+ return nullptr;
+ }
+
+ tbm_surface_info_s info;
+ int ret = tbm_surface_get_info(tsurf_origin, &info);
+ if (ret != TBM_SURFACE_ERROR_NONE) {
+ TRACKRENDERER_ERROR("failed to get tbm surface info");
+ return nullptr;
+ }
+
+ tbm_surface_h tsurf_copy =
+ tbm_surface_create(info.width, info.height, info.format);
+ if (!tsurf_copy) {
+ TRACKRENDERER_ERROR("failed to create tbm surface");
+ return nullptr;
+ }
+
+ tbm_surface_info_s info_copy;
+ ret = tbm_surface_get_info(tsurf_copy, &info_copy);
+ if (ret != TBM_SURFACE_ERROR_NONE) {
+ TRACKRENDERER_ERROR("failed to get tbm surface info");
+ tbm_surface_destroy(tsurf_copy);
+ return nullptr;
+ }
+
+ for (int i = 0; i < (int)info.num_planes; i++)
+ memcpy(info_copy.planes[i].ptr, info.planes[i].ptr, info.planes[i].size);
+
+ return tsurf_copy;
+}
+
#ifdef __DEBUG__
void DumpVideoFrame(tbm_surface_h tbm_surf) {
static int cnt = 0;
gst_caps_set_simple(new_caps_guard.get(), "maxwidth", G_TYPE_INT, max_w,
"maxheight", G_TYPE_INT, max_h, NULL);
- TRACKRENDERER_INFO("max widh [%d], max height [%d]", max_w, max_h);
+ TRACKRENDERER_INFO("max width [%d], max height [%d]", max_w, max_h);
display_->SetDisplayQualityInfo(new_caps_guard.get());
}
if (internal::IsUhd8kResolution(max_width, max_height)) {
constexpr uint32_t kAdaptiveStreaming8kMode =
- 0x80; // refer to waylandsink properity value.
+ 0x80; // refer to waylandsink property value.
TRACKRENDERER_INFO("Set 8K Video quality mode : 0x80");
display_->SetVideoQualityMode(kAdaptiveStreaming8kMode);
}
if (strstr(sink_name, "pulsesink")) {
pipeline_->SetProperty(Elements::kSinkAudio, "volume", (volume_/100.0));
} else {
- TRACKRENDERER_WARN("unknow audio sink name: %s", sink_name);
+ TRACKRENDERER_WARN("unknown audio sink name: %s", sink_name);
}
}
tbm_surface_h tbm_surf;
if (gst_is_tizen_memory(mem)) {
- tbm_surf = static_cast<tbm_surface_h>(gst_tizen_memory_get_surface(mem));
- packet.buffer_addr = gst_buffer_ref(buffer);
+ 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());
- packet.buffer_addr = nullptr;
}
+ packet.buffer_addr = nullptr;
if (!tbm_surf) {
gst_sample_unref(sample);
- TRACKRENDERER_ERROR("failed to get tbm surface");
- if (packet.buffer_addr)
- gst_buffer_unref(buffer);
+ TRACKRENDERER_ERROR("failed to create tbm surface");
return GetDecodedVideoFrameState::kUnknownError;
}
packet.surface_data = tbm_surf;
gst_sample_unref(sample);
+ TRACKRENDERER_DEBUG("packet.surface_data [%p] is created", packet.surface_data);
+
return GetDecodedVideoFrameState::kErrorNone;
}
bool TrackRenderer::ReturnDecodedPacket(const DecodedVideoPacket& packet) {
if (packet.surface_data == nullptr) return false;
- TRACKRENDERER_DEBUG("packet.surface_data [%p] will be deleted", packet.surface_data);
- if (packet.buffer_addr) // hw dec
- gst_buffer_unref(GST_BUFFER_CAST(packet.buffer_addr));
- else
- tbm_surface_destroy(static_cast<tbm_surface_h>(packet.surface_data));
+ TRACKRENDERER_DEBUG("packet.surface_data [%p] will be deleted", packet.surface_data);
+ tbm_surface_destroy(static_cast<tbm_surface_h>(packet.surface_data));
return true;
}