}
}
+#if defined(OS_TIZEN_TV_PRODUCT)
+ base::UnsafeSharedMemoryRegion GetSharedMemoryRegion() {
+ return region_.Duplicate();
+ }
+#endif // defined(OS_TIZEN_TV_PRODUCT)
+
private:
void InitializeFromSharedMemory(mojo::ScopedSharedBufferHandle handle) {
DCHECK(handle.is_valid());
DLOG(ERROR) << "Unwrapping shared memory failed.";
return;
}
- writable_mapping_ = region.Map();
+ region_ = std::move(region);
+ writable_mapping_ = region_.Map();
if (!writable_mapping_.IsValid()) {
DLOG(ERROR) << "Mapping shared memory failed.";
return;
VideoFrameBufferHandleType buffer_type_;
// Only valid for |buffer_type_ == SHARED_BUFFER_HANDLE|.
+ base::UnsafeSharedMemoryRegion region_;
base::WritableSharedMemoryMapping writable_mapping_;
// Only valid for |buffer_type_ == READ_ONLY_SHMEM_REGION|.
media::MMVideoDecoder::CanPushFrameResult::kError) {
buffer->info->metadata.player_id =
platform_video_decoder_->GetPlayerId();
- PushBufferToPlatformPlayer(buffer->buffer_id, buffer->info);
+ PushBufferToPlatformPlayer(std::move(buffer));
// do not deliver encoded frame here. the local platform player will
// give us tbm frame which could be shared inter-process.
return;
#if defined(OS_TIZEN_TV_PRODUCT)
void VideoCaptureImpl::PushBufferToPlatformPlayer(
- int32_t buffer_id,
- const media::mojom::blink::VideoFrameInfoPtr& info) {
+ media::mojom::blink::ReadyBufferPtr buffer) {
LOG(INFO) << "VideoCaptureImpl::PushBufferToPlatformPlayer";
- if (platform_video_decoder_ &&
- platform_video_decoder_->CanPushFrame() ==
+ if (!platform_video_decoder_ ||
+ platform_video_decoder_->CanPushFrame() !=
media::MMVideoDecoder::CanPushFrameResult::kOk) {
- const auto& iter = client_buffers_.find(buffer_id);
- DCHECK(iter != client_buffers_.end());
- scoped_refptr<BufferContext> buffer_context = iter->second;
- platform_video_decoder_->PushFrame(
- static_cast<const uint8_t*>(buffer_context->data()),
- info->encoded_data_size,
- media::MMVideoDecoder::PendingFrame{
- info->coded_size,
- static_cast<uint32_t>(info->timestamp.InMilliseconds()), 1,
- info->metadata.capture_begin_time.value_or(base::TimeTicks::Now()),
- true, info->metadata});
- } else {
LOG(ERROR) << "Can't use hardware to play camera stream.";
// OnFrameDropped(media::VideoCaptureFrameDropReason::
// kVideoCaptureImplFailedToWrapDataAsMediaVideoFrame);
+ GetVideoCaptureHost()->ReleaseBuffer(device_id_, buffer->buffer_id,
+ media::VideoCaptureFeedback());
+ return;
}
- GetVideoCaptureHost()->ReleaseBuffer(device_id_, buffer_id,
- media::VideoCaptureFeedback());
+
+ const auto& iter = client_buffers_.find(buffer->buffer_id);
+ DCHECK(iter != client_buffers_.end());
+ scoped_refptr<BufferContext> buffer_context = iter->second;
+ platform_video_decoder_->PushFrame(
+ buffer->buffer_id, buffer_context->GetSharedMemoryRegion(),
+ buffer->info->encoded_data_size,
+ media::MMVideoDecoder::PendingFrame{
+ buffer->info->coded_size,
+ static_cast<uint32_t>(buffer->info->timestamp.InMilliseconds()), 1,
+ buffer->info->metadata.capture_begin_time.value_or(
+ base::TimeTicks::Now()),
+ true, buffer->info->metadata, base::TimeDelta(), buffer->buffer_id});
}
void VideoCaptureImpl::OnFrameFromPlatformPlayer(
client.second.deliver_frame_cb.Run(frame, scaled_video_frames,
base::TimeTicks::Now());
}
+
+void VideoCaptureImpl::ReleaseBuffer(int32_t buffer_id) {
+ GetVideoCaptureHost()->ReleaseBuffer(device_id_, buffer_id,
+ media::VideoCaptureFeedback());
+}
#endif
void VideoCaptureImpl::OnSetAiZoomSettings(
media::BindToCurrentLoop(
base::BindRepeating(&VideoCaptureImpl::OnFrameFromPlatformPlayer,
base::Unretained(this))),
+ media::BindToCurrentLoop(base::BindRepeating(
+ &VideoCaptureImpl::ReleaseBuffer, base::Unretained(this))),
media::RtcCallType::NONE, params_.ai_zoom_settings);
#endif
base::TimeDelta::FromSeconds(10);
#if defined(OS_TIZEN_TV_PRODUCT)
- void PushBufferToPlatformPlayer(
- int32_t buffer_id,
- const media::mojom::blink::VideoFrameInfoPtr& info);
+ void PushBufferToPlatformPlayer(media::mojom::blink::ReadyBufferPtr buffer);
void OnFrameFromPlatformPlayer(scoped_refptr<media::VideoFrame> frame,
uint32_t timestamp);
+ void ReleaseBuffer(int32_t buffer_id);
#endif
void OnSetAiZoomSettings(const media::TizenAiZoomSettings& settings);
}
#if defined(OS_TIZEN_TV_PRODUCT)
+void BrowserMediaPlayerManagerEfl::OnBufferConsumed(int player_id,
+ int32_t buffer_id) {
+ Send(player_id, new MediaPlayerEflMsg_BufferConsumed(GetRoutingID(player_id),
+ player_id, buffer_id));
+}
+
void BrowserMediaPlayerManagerEfl::SetFastMediaSwitchCallback(
WebContents* web_contents) {
if (WebContentsDelegateEfl* delegate =
#endif // defined(SAMSUNG_ELEMENTARY_MEDIA_STREAM_SOURCE)
#if defined(OS_TIZEN_TV_PRODUCT)
+ void OnBufferConsumed(int player_id, int32_t buffer_id) override;
void OnSetDecryptorHandle(int player_id, eme::eme_decryptor_t decryptor);
void OnInitData(int player_id,
const std::vector<unsigned char>& init_data) override;
IPC_STRUCT_TRAITS_MEMBER(side_data)
IPC_STRUCT_TRAITS_MEMBER(tz_handle)
IPC_STRUCT_TRAITS_MEMBER(is_key_frame)
+IPC_STRUCT_TRAITS_MEMBER(buffer_id)
#endif
IPC_STRUCT_TRAITS_END()
#endif // defined(SAMSUNG_ELEMENTARY_MEDIA_STREAM_SOURCE)
#if defined(OS_TIZEN_TV_PRODUCT)
+IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_BufferConsumed,
+ int /* player_id */,
+ int32_t /* buffer_id */)
IPC_SYNC_MESSAGE_ROUTED1_1(MediaPlayerHostMsg_GetDroppedFrameCount,
int /* player_id */,
unsigned /* droppedFrameCount */)
OnNewTbmBufferAvailable)
#endif // defined(TIZEN_TBM_SUPPORT)
#if defined(OS_TIZEN_TV_PRODUCT)
+ IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_BufferConsumed, OnBufferConsumed)
IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_IsPlayerStarted, OnPlayerStarted)
IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_PlaybackComplete, OnPlaybackComplete)
IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_HardwareResources,
}
#if defined(OS_TIZEN_TV_PRODUCT)
+void RendererMediaPlayerManager::OnBufferConsumed(int player_id,
+ int32_t buffer_id) {
+ auto player = GetMediaPlayer(player_id);
+ if (player) {
+ player->OnBufferConsumed(buffer_id);
+ } else {
+ LOG(INFO) << "Player[" << player_id << "] is already destroyed";
+ }
+}
+
void RendererMediaPlayerManager::OnPlayerStarted(int player_id,
bool player_started) {
auto player = GetMediaPlayer(player_id);
base::OnceClosure) {}
#endif
#if defined(OS_TIZEN_TV_PRODUCT)
+ virtual void OnBufferConsumed(int32_t buffer_id) {}
virtual void OnAddAudioTrack(
const blink::WebMediaPlayer::audio_video_track_info_s&) {}
virtual void OnAddVideoTrack(
media_player_mgr_{};
std::unique_ptr<class MediaPlayerManagerEflImpl> rmgr_impl_;
+ void OnBufferConsumed(int player_id, int32_t buffer_id);
void OnGetPlayTrackInfo(int player_id, int id);
void OnPlayerStarted(int player_id, bool player_started);
void OnPlaybackComplete(int player_id, bool send_eos);
std::vector<uint8_t> side_data;
int tz_handle = 0; // Handle to data decrypted in the trusted zone
bool is_key_frame = false;
+ int32_t buffer_id = -1;
#endif
};
virtual void UpdateZOrder() = 0;
#endif
#if defined(OS_TIZEN_TV_PRODUCT)
+ virtual void OnBufferConsumed(int player_id, int32_t buffer_id) = 0;
virtual content::HardwareResourceHelper* HWHelper() = 0;
virtual void OnSeekableTimeChange(int player_id,
base::TimeDelta min_time,
}
#if defined(OS_TIZEN_TV_PRODUCT)
+ if (meta_data.buffer_id != -1) {
+ manager()->OnBufferConsumed(GetPlayerId(), meta_data.buffer_id);
+ }
+
if (paused_by_buffering_logic_ && seek_state_ == MEDIA_SEEK_NONE) {
UncheckedUpdateReadyState();
}
#endif // defined(TIZEN_TBM_SUPPORT)
#if defined(OS_TIZEN_TV_PRODUCT)
+void SuspendingMediaPlayer::OnBufferConsumed(int player_id, int32_t buffer_id) {
+ if (IsPlayerFullyResumed())
+ manager_->OnBufferConsumed(player_id, buffer_id);
+}
+
void SuspendingMediaPlayer::OnSeekableTimeChange(int player_id,
base::TimeDelta min_time,
base::TimeDelta max_time,
#endif // defined(TIZEN_TBM_SUPPORT)
#if defined(OS_TIZEN_TV_PRODUCT)
+ void OnBufferConsumed(int player_id, int32_t buffer_id) override;
unsigned GetDroppedFrameCount() const override;
unsigned GetDecodedFrameCount() const override;
void OnSeekableTimeChange(int player_id,
Mode mode,
InitDoneCb init_done_cb,
FrameCb frame_cb,
+ BufferConsumedCb buffer_consumed_cb,
RtcCallType calltype,
absl::optional<TizenAiZoomSettings> ai_zoom_settings)
: main_thread_(content::RenderThreadImpl::DeprecatedGetMainTaskRunner()),
codec_(codec),
init_done_(std::move(init_done_cb)),
frame_cb_(std::move(frame_cb)),
+ buffer_consumed_cb_(std::move(buffer_consumed_cb)),
ai_zoom_settings_(ai_zoom_settings) {
TRACE_EVENT0("media", "MMVideoDecoder::MMVideoDecoder");
MP_LOG(INFO) << __func__ << " calltype: " << static_cast<int>(call_type_);
}
}
-bool MMVideoDecoder::PushFrame(const uint8_t* data,
+bool MMVideoDecoder::PushFrame(uint32_t buffer_id,
+ base::UnsafeSharedMemoryRegion shared_memory,
std::size_t size,
const PendingFrame& info) {
TRACE_EVENT2("webrtc", "MMVideoDecoder::PushFrame", "frame timestamp",
if (!demuxer_)
return false;
- if (size <= 0) {
- LOG(ERROR) << "Frame has no data";
- return false;
- }
-
- auto shared_memory = base::UnsafeSharedMemoryRegion::Create(size);
- media::DemuxedBufferMetaData meta_data;
-
if (!shared_memory.IsValid()) {
- LOG(ERROR) << "Failed to create shared memory region.";
+ LOG(ERROR) << "Invalid shared memory region.";
return false;
}
- auto mapping = shared_memory.Map();
- memcpy(mapping.memory(), data, size);
+ media::DemuxedBufferMetaData meta_data;
if (first_frame_rtp_timestamp_ == 0) {
first_frame_rtp_timestamp_ = info.timestamp;
meta_data.time_duration = base::TimeDelta::FromMilliseconds(16);
meta_data.end_of_stream = false;
// meta_data.is_key_frame = info.is_keyframe;
+ meta_data.buffer_id = info.buffer_id;
MP_DLOG(INFO) << __func__ << " rtc_time: " << info.timestamp
<< " player time: " << timestamp;
#endif
}
+void MMVideoDecoder::OnBufferConsumed(int32_t buffer_id) {
+ if (buffer_consumed_cb_) {
+ buffer_consumed_cb_.Run(buffer_id);
+ }
+}
+
void MMVideoDecoder::SetCallBackFrameSize(const gfx::Size& size) {
MP_LOG(INFO) << __func__;
if (!main_thread_->BelongsToCurrentThread()) {
using InitDoneCb = base::OnceCallback<void()>;
using FrameCb = base::RepeatingCallback<void(scoped_refptr<media::VideoFrame>,
uint32_t orig_timestamp)>;
+ using BufferConsumedCb = base::RepeatingCallback<void(int32_t buffer_id)>;
enum class CanDropFrames { kNo, kYes };
enum class ForceSubResouces { kNo, kYes };
Mode mode,
InitDoneCb init_done_cb,
FrameCb frame_cb,
+ BufferConsumedCb buffer_consumed_cb,
RtcCallType calltype,
absl::optional<TizenAiZoomSettings> ai_zoom_settings = absl::nullopt);
~MMVideoDecoder() final;
bool is_keyframe;
absl::optional<media::VideoFrameMetadata> metadata{};
base::TimeDelta player_timestamp{};
+ int32_t buffer_id = -1;
};
- bool PushFrame(const uint8_t* data,
+ bool PushFrame(uint32_t buffer_id,
+ base::UnsafeSharedMemoryRegion shared_memory,
std::size_t size,
const PendingFrame& info);
void OnNewTbmBufferAvailable(const gfx::TbmBufferHandle& tbm_buffer_handle,
base::TimeDelta time_delta,
base::OnceClosure closure) override;
+ void OnBufferConsumed(int32_t buffer_id) override;
void EnableTbmBufferCallBack(bool enable);
void SetCallBackFrameSize(const gfx::Size& size);
bool visible_{true};
InitDoneCb init_done_{};
FrameCb frame_cb_{};
+ BufferConsumedCb buffer_consumed_cb_{};
absl::optional<TizenAiZoomSettings> ai_zoom_settings_;
base::WeakPtrFactory<MMVideoDecoder> weak_factory_{this};
base::TimeDelta timestamp,
base::OnceClosure release_buffer),
(override));
+ MOCK_METHOD(void,
+ OnBufferConsumed,
+ (int player_id, int32_t buffer_id),
+ (override));
MOCK_METHOD(void,
RegisterMediaPacket,
(int player_id, TbmHandlePtr tbm_handle),