[MM] Implement ImageCapture class for video hole mode 65/293965/2
authorzhishun.zhou <zhishun.zhou@samsung.com>
Fri, 9 Jun 2023 07:07:56 +0000 (15:07 +0800)
committerBot Blink <blinkbot@samsung.com>
Fri, 9 Jun 2023 07:36:26 +0000 (07:36 +0000)
Support imageCapture.grabFrame web API on TBM video frame case.

From patch:
https://review.tizen.org/gerrit/#/c/269436/

Change-Id: I199d98f3c1a19bfe0e873b0b04a816a0191bcd7e
Signed-off-by: zhishun.zhou <zhishun.zhou@samsung.com>
third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.cc
tizen_src/chromium_impl/media/base/tizen/media_source_esplus_player_capi.cc

index 483c4887413cf62235bd2b968a16314605b10423..82297dda72b58bad878bd80385650cb555cf05e8 100644 (file)
 #include "third_party/skia/include/core/SkSurface.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 
+#if defined(OS_TIZEN_TV_PRODUCT)
+#include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h"
+#endif
+
 namespace WTF {
 // Template specialization of [1], needed to be able to pass callbacks
 // that have ScopedWebCallbacks paramaters across threads.
@@ -120,6 +124,12 @@ void ImageCaptureFrameGrabber::SingleShotFrameHandler::ConvertAndDeliverFrame(
   // it back from the GPU.
   const bool is_readable = frame->format() == media::PIXEL_FORMAT_I420 ||
                            frame->format() == media::PIXEL_FORMAT_I420A ||
+#if defined(OS_TIZEN_TV_PRODUCT) && defined(TIZEN_VIDEO_HOLE)
+                           frame->storage_type() == media::VideoFrame::STORAGE_HOLE ||
+#endif
+#if defined(OS_TIZEN_TV_PRODUCT) && defined(TIZEN_TBM_SUPPORT)
+                           frame->format() == media::PIXEL_FORMAT_TBM_INTER_PROCESS_BUFFER ||
+#endif
                            (frame->format() == media::PIXEL_FORMAT_NV12 &&
                             frame->HasGpuMemoryBuffer());
   if (!is_readable) {
@@ -193,7 +203,38 @@ void ImageCaptureFrameGrabber::SingleShotFrameHandler::ConvertAndDeliverFrame(
         NOTREACHED();
     }
     gmb->Unmap();
-  } else {
+  }
+#if defined(OS_TIZEN_TV_PRODUCT) && defined(TIZEN_TBM_SUPPORT)
+  else if (frame->format() == media::PIXEL_FORMAT_TBM_INTER_PROCESS_BUFFER) {
+    switch (destination_pixel_format) {
+      case libyuv::FOURCC_ABGR:
+        libyuv::NV12ToABGR(frame->visible_data(media::VideoFrame::kYPlane),
+                           frame->stride(media::VideoFrame::kYPlane),
+                           frame->visible_data(media::VideoFrame::kUVPlane),
+                           frame->stride(media::VideoFrame::kUVPlane),
+                           destination_plane, destination_stride,
+                           destination_width, destination_height);
+        break;
+      case libyuv::FOURCC_ARGB:
+        libyuv::NV12ToARGB(frame->visible_data(media::VideoFrame::kYPlane),
+                           frame->stride(media::VideoFrame::kYPlane),
+                           frame->visible_data(media::VideoFrame::kUVPlane),
+                           frame->stride(media::VideoFrame::kUVPlane),
+                           destination_plane, destination_stride,
+                           destination_width, destination_height);
+        break;
+      default:
+        NOTREACHED();
+    }
+  }
+#endif
+#if defined(OS_TIZEN_TV_PRODUCT) && defined(TIZEN_VIDEO_HOLE)
+  else if (frame->storage_type() == media::VideoFrame::STORAGE_HOLE) {
+    // fill black
+    pixmap.erase(SkColorSetARGB(255, 0, 0, 0));
+  }
+#endif
+  else {
     DCHECK(frame->format() == media::PIXEL_FORMAT_I420 ||
            frame->format() == media::PIXEL_FORMAT_I420A);
     libyuv::ConvertFromI420(frame->visible_data(media::VideoFrame::kYPlane),
@@ -242,6 +283,18 @@ void ImageCaptureFrameGrabber::GrabFrame(
     return;
   }
 
+#if defined(OS_TIZEN_TV_PRODUCT) && defined(TIZEN_TBM_SUPPORT)
+  // enable the espp callback for grabber sink
+  MediaStreamVideoTrack* track =
+      MediaStreamVideoTrack::From(component);
+  if (track)
+    track->OnWebRtcSendStreamUserDataEncoder(true);
+  else {
+    callbacks->OnError();
+    return;
+  }
+#endif
+
   auto scoped_callbacks =
       MakeScopedWebCallbacks(std::move(callbacks), WTF::Bind(&OnError));
 
index 266dbb19480f38f6bac7f67c27fa6146a4652ffd..e4c98eda613cc6b574d850c4dfd3c3df28530ab8 100644 (file)
@@ -2290,6 +2290,11 @@ void MediaSourceESPlusPlayerCapi::UpdateResolution(int width,
 
 #if defined(TIZEN_TBM_SUPPORT)
 void MediaSourceESPlusPlayerCapi::EnableTbmBufferCallBack() {
+  if (decoded_frame_buffer_type_ ==
+      ESPLUSPLAYER_DECODED_VIDEO_FRAME_BUFFER_TYPE_SCALE) {
+    LOG_ID(INFO, GetPlayerId()) << "tbm buffer callback had enabled, skip it";
+    return;
+  }
 #if TIZEN_VERSION_AT_LEAST(6, 0, 0)  // FIXME:M94 bringup on 5.5 platform
   if (use_subscaler_ && GetPlayerState() != ESPLUSPLAYER_STATE_NONE) {
     decoded_frame_buffer_type_ =
@@ -2304,6 +2309,8 @@ void MediaSourceESPlusPlayerCapi::EnableTbmBufferCallBack() {
           << player_error;
     }
     SetCallBackFrameSize(cb_frame_width_, cb_frame_height_);
+  } else {
+    LOG_ID(ERROR, GetPlayerId()) << "invalid player state";
   }
 #endif
 }