support video decoded callback 64/263064/2 tizen_devel accepted/tizen/unified/20210830.103725 submit/tizen/20210829.235404
authorEunhye Choi <eunhae1.choi@samsung.com>
Wed, 25 Aug 2021 08:38:00 +0000 (17:38 +0900)
committerEunhye Choi <eunhae1.choi@samsung.com>
Thu, 26 Aug 2021 02:16:51 +0000 (11:16 +0900)
- in case of zero copy, keep buffer addr during rendering
  and unref it if rendering is finished.(hw dec)
- if there is no buffer addr, the tbm surface have to be destroyed
  which is newly created for each decoded buffer.(sw dec)

Change-Id: I0e8c6afd66275a8753dbf1a8a3d41b718ea857fe

config/esplusplayer.ini [changed mode: 0755->0644]
include/plusplayer/types/buffer.h
src/esplusplayer/include_internal/esplayer/decoded_pkt_list.h
src/esplusplayer/src/esplusplayer_capi.cpp
src/plusplayer-core/src/trackrendereradapter_utils.cpp
ut/include/esplusplayer/eseventlistener.hpp [changed mode: 0755->0644]
ut/src/esplusplayer/ut_basic.cpp

old mode 100755 (executable)
new mode 100644 (file)
index 56f20e5..bbcb276
@@ -1,12 +1,8 @@
 {\r
-  "version" : "0.0.4948390.firmware",\r
   "gstparam1" : "--gst-debug=*:2",\r
   "gstparam2" : "--gst-disable-segtrap",\r
   "gstparam3" : "--gst-plugin-load",\r
   "gstparam4" : "--gst-disable-registry-fork",\r
   "gstparam5" : "--gst-disable-registry-update",\r
-  "tz_video_es_dump" : false,\r
-  "tz_video_dump_insert_vp9_header" : false,\r
-  "tz_audio_es_dump" : false,\r
   "generate_dot" : false\r
 }\r
index 2dc5737..94b1785 100644 (file)
@@ -53,7 +53,7 @@ struct DecodedVideoPacket {
   uint64_t pts = 0;
   uint64_t duration = 0;
   tbm_surface_h surface_data = nullptr;  // tbm_surface
-  void* scaler_index = nullptr;
+  void* buffer_addr = nullptr;
 };
 
 }  // namespace plusplayer
index ab15164..843ae1c 100644 (file)
@@ -11,6 +11,7 @@
 #include <functional>
 #include <list>
 #include <memory>
+#include <gst/gst.h>
 
 #include "core/utils/plusplayer_log.h"
 #include "plusplayer/types/buffer.h"
@@ -19,8 +20,13 @@ namespace {
 void DecodedPacketDeleter(esplusplayer_decoded_video_packet* packet) {
   if (packet == nullptr || packet->surface_data == nullptr) return;
   // LOG_DEBUG("packet[%p] deleted", packet);
-  tbm_surface_destroy(static_cast<tbm_surface_h>(packet->surface_data));
-  packet->surface_data = NULL;
+  if(packet->private_data) { // hw dec
+    gst_buffer_unref((GstBuffer *)packet->private_data);
+    packet->private_data = nullptr;
+  } else {
+    tbm_surface_destroy(static_cast<tbm_surface_h>(packet->surface_data));
+    packet->surface_data = NULL;
+  }
 }
 }  // namespace
 
index 47c96f1..7b8aa6c 100644 (file)
@@ -271,7 +271,7 @@ class listener_bridge : public plusplayer::EsEventListener {
     _pkt->pts = packet.pts;
     _pkt->duration = packet.duration;
     _pkt->surface_data = static_cast<void*>(packet.surface_data);
-    _pkt->private_data = packet.scaler_index;
+    _pkt->private_data = packet.buffer_addr;
     if (decoded_pkt_mgr_ && decoded_pkt_mgr_->TryToAdd(_pkt)) {
       this->media_packet_video_decoded_cb_(
           _pkt, media_packet_video_decoded_cb_userdata_);
index da91e7a..124fdeb 100644 (file)
@@ -471,7 +471,7 @@ DecodedVideoPacket ConvertToDecodedVideoPacket(
   _packet.pts = packet->pts;
   _packet.duration = packet->duration;
   _packet.surface_data = static_cast<tbm_surface_h>(packet->surface_data);
-  _packet.scaler_index = packet->scaler_index;
+  _packet.buffer_addr = packet->buffer_addr;
   return _packet;
 }
 
old mode 100755 (executable)
new mode 100644 (file)
index 016a47d..36d8d64
@@ -72,13 +72,16 @@ class EsPlayerEventCallback {
                                  void* userdata) {
     std::cout << "OnBufferTimeStatus" << std::endl;
   }
-  static void OnVideoDecoded(const esplusplayer_decoded_video_packet*,
+  static void OnVideoDecoded(const esplusplayer_decoded_video_packet * pkt,
                              void* userdata) {
+    EsPlayerEventCallback* cb = static_cast<EsPlayerEventCallback*>(userdata);
+
     std::cout << "OnVideoDecoded" << std::endl;
+    esplusplayer_decoded_buffer_destroy (cb->handle_, (esplusplayer_decoded_video_packet *)pkt);
   }
   static void OnClosedCaption(const char* data, const int size,
                               void* userdata) {
-    std::cout << "OnVideoDecoded" << std::endl;
+    std::cout << "OnClosedCaption" << std::endl;
   }
   static void OnFlushDone(void* userdata) {
     std::cout << "OnFlushDone" << std::endl;
index 312e9e8..769a800 100644 (file)
@@ -151,6 +151,24 @@ TEST_F(EsTest, vdapi_basic_esplusplayer_set_video_frame_buffer_type_p_1) {
   ASSERT_EQ(esplusplayer_destroy(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
 }
 
+TEST_P(EsBasicTest, vdapi_basic_esplusplayer_set_video_frame_buffer_type_p_2) {
+  ASSERT_EQ(esplusplayer_open(esplayer_), ESPLUSPLAYER_ERROR_TYPE_NONE);
+  ASSERT_EQ(esplusplayer_set_video_frame_buffer_type(
+                esplayer_, ESPLUSPLAYER_DECODED_VIDEO_FRAME_BUFFER_TYPE_REFERENCE),
+            ESPLUSPLAYER_ERROR_TYPE_NONE);
+
+  ASSERT_TRUE(video_reader_->SetStreamInfo(esplayer_));
+  ASSERT_TRUE(audio_reader_->SetStreamInfo(esplayer_));
+  ASSERT_EQ(esplusplayer_prepare_async(esplayer_),
+            ESPLUSPLAYER_ERROR_TYPE_NONE);
+
+  callback_->WaitForPrepareDone();
+  ASSERT_EQ(esplusplayer_start(esplayer_), ESPLUSPLAYER_ERROR_TYPE_NONE);
+  std::this_thread::sleep_for(std::chrono::seconds(10));
+
+  std::cout << "BasicTest, set video frame buffer type, END" << std::endl;
+}
+
 TEST_F(EsTest, vdapi_basic_esplusplayer_set_buffer_size_p_1) {
   esplusplayer_handle esplayer = esplusplayer_create();
   ASSERT_NE(nullptr, esplayer);