--- /dev/null
+// Copyright 2015 Samsung Electronics Inc. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+#include "media/base/efl/media_player_efl.h"
+
+#include "media/base/efl/media_player_manager_efl.h"
+
+#if defined(TIZEN_TBM_SUPPORT)
+#include "media/base/tizen/media_packet_manager.h"
+#endif
+
+namespace media {
+
+MediaPlayerEfl::MediaPlayerEfl(int player_id, MediaPlayerManager* manager)
+ : destructing_(false), width_(0), height_(0), player_id_(player_id),
+ suspended_(false), manager_(manager) {}
+
+#if defined(TIZEN_TBM_SUPPORT)
+void MediaPlayerEfl::DeliverMediaPacket(media_packet_h packet) {
+ tbm_surface_info_s suf_info = {0, };
+ scoped_ptr<media::MediaPacketProxy> packet_proxy(
+ new media::MediaPacketProxy(packet));
+
+ if (TBM_SURFACE_ERROR_NONE !=
+ tbm_surface_get_info(packet_proxy->tbmsurface_handle, &suf_info)) {
+ LOG(ERROR) << "tbm_surface_get_info() failed";
+ return;
+ }
+
+ if (width_ != static_cast<int>(suf_info.width) ||
+ height_ != static_cast<int>(suf_info.height)) {
+ width_ = static_cast<int>(suf_info.width);
+ height_ = static_cast<int>(suf_info.height);
+ // Format will always convert to I420
+ manager_->OnMediaDataChange(
+ GetPlayerId(), TBM_FORMAT_YUV420, height_, width_, MEDIA_VIDEO_MASK);
+ }
+
+ // TODO(max): Need to check if we can use "media_packet_get_pts" instead of
+ // generating a new timestamp in here.
+ base::TimeDelta timestamp =
+ base::TimeDelta::FromSecondsD(GetCurrentTime());
+
+#if defined(TIZEN_TBM_SUPPORT)
+ // TODO(max): Need to check if "TbmBufferHandle" is inevitable.
+ gfx::TbmBufferHandle tbm_handle = { packet_proxy->tbmsurface_handle };
+ manager()->OnNewTbmBufferAvailable(GetPlayerId(), tbm_handle, timestamp);
+#else
+ base::SharedMemory shared_memory;
+ uint32 shared_memory_size = suf_info.size;
+ if (!shared_memory.CreateAndMapAnonymous(shared_memory_size)) {
+ LOG(ERROR) << "Shared Memory creation failed.";
+ return;
+ }
+
+ base::SharedMemoryHandle foreign_memory_handle;
+ if (!shared_memory.ShareToProcess(base::Process::Current().Handle(),
+ &foreign_memory_handle)) {
+ LOG(ERROR) << "Shared Memory handle could not be obtained";
+ return;
+ }
+
+ base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds(position);
+ unsigned char* y_ptr = static_cast<unsigned char*>(shared_memory.memory());
+ switch (suf_info.format) {
+ case TBM_FORMAT_NV12: {
+ unsigned char* u_ptr = y_ptr + suf_info.planes[0].size;
+ unsigned char* v_ptr = u_ptr + (suf_info.planes[0].size * 5 / 4);
+ libyuv::NV12ToI420(suf_info.planes[0].ptr, suf_info.planes[0].stride,
+ suf_info.planes[1].ptr, suf_info.planes[1].stride,
+ y_ptr, suf_info.planes[0].stride,
+ u_ptr, suf_info.planes[1].stride / 2,
+ v_ptr, suf_info.planes[1].stride / 2,
+ suf_info.width, suf_info.height);
+ break;
+ }
+ case TBM_FORMAT_YUV420: {
+ unsigned char* u_ptr = y_ptr + suf_info.planes[0].size;
+ unsigned char* v_ptr = u_ptr + suf_info.planes[1].size;
+ libyuv::I420Copy(suf_info.planes[0].ptr, suf_info.planes[0].stride,
+ suf_info.planes[1].ptr, suf_info.planes[1].stride,
+ suf_info.planes[2].ptr, suf_info.planes[2].stride,
+ y_ptr, suf_info.planes[0].stride,
+ u_ptr, suf_info.planes[1].stride,
+ v_ptr, suf_info.planes[2].stride,
+ suf_info.width, suf_info.height);
+ break;
+ }
+ default: {
+ NOTIMPLEMENTED();
+ LOG(WARNING) << "Not supported format";
+ return;
+ }
+ }
+ manager()->OnNewFrameAvailable(GetPlayerId(), foreign_memory_handle,
+ shared_memory_size, timestamp);
+#endif
+ MediaPacketManager::GetInstance()->Push(packet_proxy.Pass());
+}
+#endif
+
+} // namespace media
#include "media/base/media_export.h"
#include "url/gurl.h"
+typedef struct media_packet_s* media_packet_h;
+
namespace content {
class BrowserDemuxerEfl;
}
namespace media {
class MediaPlayerManager;
+struct MediaPacketProxy;
// Error types for MediaErrorCB.
enum MediaErrorType {
virtual void Destroy() = 0;
protected:
+ explicit MediaPlayerEfl(int player_id, MediaPlayerManager* manager);
+
// Release the player resources.
virtual void Release() = 0;
-
- explicit MediaPlayerEfl(int player_id, MediaPlayerManager* manager)
- : destructing_(false), player_id_(player_id),
- suspended_(false), manager_(manager) {}
-
MediaPlayerManager* manager() { return manager_; }
+#if defined(TIZEN_TBM_SUPPORT)
+ void DeliverMediaPacket(media_packet_h packet);
+#endif
+
bool destructing_;
+ int width_;
+ int height_;
private:
// Player ID assigned to this player.
const int ERROR_MAX = sizeof(errorlist) / sizeof(errorlist[0]);
+
+// TODO(max): Remove these proxy free functions.
+
// Called by player_prepare_async()
// It's guaranteed that no callback after player destructed.
static void PlayerPreparedCb(void* data) {
LOG(ERROR) << "media_packet handle is null";
return;
}
-
media::MediaPlayerBridgeCapi* player =
static_cast<media::MediaPlayerBridgeCapi*>(data);
- player->OnMediaPacketUpdated(
- scoped_ptr<media::MediaPacketProxy>(new media::MediaPacketProxy(packet)));
+ player->OnMediaPacketUpdated(packet);
}
// Called by player_set_completed_cb()
player_(NULL),
url_(url),
volume_(volume),
- user_agent_(user_agent),
media_type_(0),
- player_width_(0),
- player_height_(0),
- video_format_(0),
is_end_reached_(false),
is_file_url_(false),
is_paused_(true),
is_play_pending_(false),
is_initialized_(false),
duration_(0),
- seek_duration_(0),
playback_time_(0),
+ seek_duration_(0),
pending_seek_duration_(0),
playback_rate_(1.0),
delayed_player_state_(PLAYER_STATE_DELAYED_NULL),
+ user_agent_(user_agent),
weak_factory_(this) {
int ret = player_create(&player_);
if (ret != PLAYER_ERROR_NONE) {
media_type_ |= MEDIA_AUDIO_MASK;
// Video stream is present if both video width and height are valid.
- if (player_width_ > 0 && player_height_ > 0)
+ if (width_ > 0 && height_ > 0)
media_type_ |= MEDIA_VIDEO_MASK;
- manager()->OnMediaDataChange(GetPlayerId(), video_format_, player_height_,
- player_width_, media_type_);
+ manager()->OnMediaDataChange(
+ GetPlayerId(), TBM_FORMAT_YUV420, height_, width_, media_type_);
}
void MediaPlayerBridgeCapi::UpdateDuration() {
RunCompleteCB(true, FROM_HERE);
}
-void MediaPlayerBridgeCapi::MediaPacketUpdated(
- scoped_ptr<MediaPacketProxy> packet) {
- SendFrame(packet->tbmsurface_handle);
- MediaPacketManager::GetInstance()->Push(packet.Pass());
-}
-
-void MediaPlayerBridgeCapi::SendFrame(tbm_surface_h surface) {
- tbm_surface_info_s suf_info;
- int ret = tbm_surface_get_info(surface, &suf_info);
- int position = -1;
- if (ret != TBM_SURFACE_ERROR_NONE) {
- LOG(ERROR) << "tbm_surface_get_info() failed";
- return;
- }
-
- // CAPI doesn't give out resolution change notification.
- if (player_height_ != static_cast<int>(suf_info.height) ||
- player_width_ != static_cast<int>(suf_info.width)) {
- player_height_ = suf_info.height;
- player_width_ = suf_info.width;
- // Format will always convert to I420
- video_format_ = TBM_FORMAT_YUV420;
- manager()->OnMediaDataChange(GetPlayerId(), video_format_, player_height_,
- player_width_, media_type_);
- }
-
-#if defined(USE_LEGACY_PLAYER_CAPI)
- player_get_position(player_, &position);
-#else
- player_get_play_position(player_, &position);
-#endif
- base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds(position);
-
-#if defined(TIZEN_TBM_SUPPORT)
- gfx::TbmBufferHandle tbm_handle;
- tbm_handle.tbm_surface = reinterpret_cast<void*>(surface);
- manager()->OnNewTbmBufferAvailable(
- GetPlayerId(), tbm_handle, timestamp);
-#else
- base::SharedMemory shared_memory;
- uint32 shared_memory_size = suf_info.size;
- if (!shared_memory.CreateAndMapAnonymous(shared_memory_size)) {
- LOG(ERROR) << "Shared Memory creation failed.";
- return;
- }
-
- base::SharedMemoryHandle foreign_memory_handle;
- if (!shared_memory.ShareToProcess(base::Process::Current().Handle(),
- &foreign_memory_handle)) {
- LOG(ERROR) << "Shared Memory handle could not be obtained";
- return;
- }
-
- base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds(position);
- unsigned char* y_ptr = static_cast<unsigned char*>(shared_memory.memory());
- switch (suf_info.format) {
- case TBM_FORMAT_NV12: {
- unsigned char* u_ptr = y_ptr + suf_info.planes[0].size;
- unsigned char* v_ptr = u_ptr + (suf_info.planes[0].size * 5 / 4);
- libyuv::NV12ToI420(suf_info.planes[0].ptr, suf_info.planes[0].stride,
- suf_info.planes[1].ptr, suf_info.planes[1].stride,
- y_ptr, suf_info.planes[0].stride,
- u_ptr, suf_info.planes[1].stride / 2,
- v_ptr, suf_info.planes[1].stride / 2,
- suf_info.width, suf_info.height);
- break;
- }
- case TBM_FORMAT_YUV420: {
- unsigned char* u_ptr = y_ptr + suf_info.planes[0].size;
- unsigned char* v_ptr = u_ptr + suf_info.planes[1].size;
- libyuv::I420Copy(suf_info.planes[0].ptr, suf_info.planes[0].stride,
- suf_info.planes[1].ptr, suf_info.planes[1].stride,
- suf_info.planes[2].ptr, suf_info.planes[2].stride,
- y_ptr, suf_info.planes[0].stride,
- u_ptr, suf_info.planes[1].stride,
- v_ptr, suf_info.planes[2].stride,
- suf_info.width, suf_info.height);
- break;
- }
- default: {
- NOTIMPLEMENTED();
- LOG(WARNING) << "Not supported format";
- return;
- }
- }
- manager()->OnNewFrameAvailable(GetPlayerId(), foreign_memory_handle,
- shared_memory_size, timestamp);
-#endif
-}
-
void MediaPlayerBridgeCapi::HandleBufferingStatus(int percent) {
if (is_paused_ || is_seeking_)
return;
}
}
-void MediaPlayerBridgeCapi::OnMediaPacketUpdated(
- scoped_ptr<MediaPacketProxy> packet) {
+void MediaPlayerBridgeCapi::OnMediaPacketUpdated(media_packet_h packet) {
task_runner_->PostTask(
- FROM_HERE, base::Bind(&MediaPlayerBridgeCapi::MediaPacketUpdated,
- weak_factory_.GetWeakPtr(), base::Passed(&packet)));
+ FROM_HERE, base::Bind(&MediaPlayerBridgeCapi::DeliverMediaPacket,
+ weak_factory_.GetWeakPtr(), packet));
}
void MediaPlayerBridgeCapi::OnPlaybackCompleteUpdate() {
#include "content/public/browser/browser_message_filter.h"
#include "media/base/ranges.h"
#include "media/base/efl/media_player_efl.h"
-#include "media/base/tizen/media_packet_manager.h"
#include "media/base/video_frame.h"
-#include <media_packet.h>
-#include <tbm_surface.h>
-
namespace media {
class MEDIA_EXPORT MediaPlayerBridgeCapi
void ExecuteDelayedPlayerState();
- void OnMediaPacketUpdated(scoped_ptr<MediaPacketProxy> packet);
- void SendFrame(tbm_surface_h surface);
-
void OnPlaybackCompleteUpdate();
void OnSeekCompleteUpdate();
void OnPlayerPrepared();
void OnHandleError(int ret, char const* from);
void OnResumeComplete(bool success);
void OnInitComplete(bool success);
+ void OnMediaPacketUpdated(media_packet_h packet);
protected:
void Release() override;
void UpdateSeekState(bool state);
void UpdateDuration();
- void MediaPacketUpdated(scoped_ptr<MediaPacketProxy> packet);
void PlaybackCompleteUpdate();
void SeekCompleteUpdate();
void PlayerPrepared();
double volume_;
int media_type_;
- int player_width_;
- int player_height_;
- unsigned int video_format_;
bool is_end_reached_;
bool is_file_url_;
double duration_;
double playback_time_;
double seek_duration_;
- double seek_pending_;
double pending_seek_duration_;
double playback_rate_;
int delayed_player_state_;
#include "base/thread_task_runner_handle.h"
#include "content/browser/media/efl/browser_demuxer_efl.h"
#include "media/base/efl/media_player_manager_efl.h"
-#include "media/base/tizen/media_packet_manager.h"
#include "media/base/tizen/media_source_player_capi.h"
#include "third_party/libyuv/include/libyuv.h"
task_runner_(base::ThreadTaskRunnerHandle::Get()),
weak_this_(this),
player_(NULL),
- video_frame_format_(0),
media_type_(0),
duration_(0),
play_rate_(1.0f),
XSync(native_display, false);
}
#else
-void MediaSourcePlayerCapi::MediaPacketUpdated(media_packet_h packet) {
- scoped_ptr<media::MediaPacketProxy> packet_proxy(
- new media::MediaPacketProxy(packet));
- SendFrame(packet_proxy->tbmsurface_handle);
- MediaPacketManager::GetInstance()->Push(packet_proxy.Pass());
-}
-
-void MediaSourcePlayerCapi::SendFrame(tbm_surface_h surface) {
- tbm_surface_info_s suf_info = {0, };
- int ret = tbm_surface_get_info(surface, &suf_info);
- int position = -1;
-
- if (ret != TBM_SURFACE_ERROR_NONE) {
- LOG(ERROR) << "tbm_surface_get_info() failed";
- return;
- }
- if (height_ != suf_info.height || width_ != suf_info.width ||
- video_frame_format_ == 0) {
- height_ = suf_info.height;
- width_ = suf_info.width;
-
- // Format will always convert to I420 format
- video_frame_format_ = TBM_FORMAT_YUV420;
- manager()->OnMediaDataChange(GetPlayerId(), video_frame_format_,
- height_, width_, media_type_);
- }
-
-#if defined(USE_LEGACY_PLAYER_CAPI)
- player_get_position(player_, &position);
-#else
- player_get_play_position(player_, &position);
-#endif
-
- base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds(position);
-#if defined(TIZEN_TBM_SUPPORT)
- gfx::TbmBufferHandle tbm_handle;
- tbm_handle.tbm_surface = reinterpret_cast<void*>(surface);
- manager()->OnNewTbmBufferAvailable(
- GetPlayerId(), tbm_handle, timestamp);
-#else
- base::SharedMemory shared_memory;
- uint32 shared_memory_size = suf_info.size;
- if (!shared_memory.CreateAndMapAnonymous(shared_memory_size)) {
- LOG(ERROR) << "Shared Memory creation failed.";
- return;
- }
-
- base::SharedMemoryHandle foreign_memory_handle;
- if (!shared_memory.ShareToProcess(
- base::Process::Current().Handle(), &foreign_memory_handle)) {
- LOG(ERROR) << "Shared Memory handle could not be obtained";
- return;
- }
-
- base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds(position);
- unsigned char* y_ptr = static_cast<unsigned char*>(shared_memory.memory());
- switch (suf_info.format) {
- case TBM_FORMAT_NV12: {
- unsigned char* u_ptr = y_ptr + suf_info.planes[0].size;
- unsigned char* v_ptr = u_ptr + (suf_info.planes[0].size * 5 / 4);
- libyuv::NV12ToI420(suf_info.planes[0].ptr, suf_info.planes[0].stride,
- suf_info.planes[1].ptr, suf_info.planes[1].stride,
- y_ptr, suf_info.planes[0].stride,
- u_ptr, suf_info.planes[1].stride / 2,
- v_ptr, suf_info.planes[1].stride / 2,
- suf_info.width, suf_info.height);
- break;
- }
- case TBM_FORMAT_YUV420: {
- unsigned char* u_ptr = y_ptr + suf_info.planes[0].size;
- unsigned char* v_ptr = u_ptr + suf_info.planes[1].size;
- libyuv::I420Copy(suf_info.planes[0].ptr, suf_info.planes[0].stride,
- suf_info.planes[1].ptr, suf_info.planes[1].stride,
- suf_info.planes[2].ptr, suf_info.planes[2].stride,
- y_ptr, suf_info.planes[0].stride,
- u_ptr, suf_info.planes[1].stride,
- v_ptr, suf_info.planes[2].stride,
- suf_info.width, suf_info.height);
- break;
- }
- default: {
- NOTIMPLEMENTED();
- LOG(WARNING) << "Not supported format";
- return;
- }
- }
- manager()->OnNewFrameAvailable(
- GetPlayerId(), foreign_memory_handle, shared_memory_size, timestamp);
-#endif // TIZEN_TBM_SUPPORT
+void MediaSourcePlayerCapi::OnMediaPacketUpdated(media_packet_h packet) {
+ task_runner_->PostTask(
+ FROM_HERE, base::Bind(&MediaSourcePlayerCapi::DeliverMediaPacket,
+ base::Unretained(this), packet));
}
#endif // TIZEN_VIDEO_HOLE
if (width_ > 0 && height_ > 0)
media_type_ |= MEDIA_VIDEO_MASK;
- manager()->OnMediaDataChange(GetPlayerId(), video_frame_format_, height_,
+ manager()->OnMediaDataChange(GetPlayerId(), TBM_FORMAT_YUV420, height_,
width_, media_type_);
manager()->OnReadyStateChange(
GetPlayerId(), blink::WebMediaPlayer::ReadyStateHaveMetadata);
underflow_status));
}
-#if !defined(TIZEN_VIDEO_HOLE)
-void MediaSourcePlayerCapi::OnMediaPacketUpdated(media_packet_h packet) {
- task_runner_->PostTask(
- FROM_HERE, base::Bind(&MediaSourcePlayerCapi::MediaPacketUpdated,
- base::Unretained(this),
- packet));
-}
-#endif
-
void MediaSourcePlayerCapi::OnPlayerError(int error_code, const char* msg) {
task_runner_->PostTask(
FROM_HERE, base::Bind(&MediaSourcePlayerCapi::HandlePlayerError,
#ifndef MEDIA_BASE_TIZEN_MEDIA_SOURCE_PLAYER_CAPI_H_
#define MEDIA_BASE_TIZEN_MEDIA_SOURCE_PLAYER_CAPI_H_
-#include <media_packet.h>
#include <player.h>
#include "base/cancelable_callback.h"
#include "media/base/decoder_buffer.h"
#include "third_party/WebKit/public/platform/WebMediaPlayer.h"
-#ifndef TIZEN_VIDEO_HOLE
-#include <tbm_surface.h>
-#endif
-
namespace media {
// This class handles media source extensions for CAPI port.
void SeekComplete();
void BufferMetaDataAvailable(const media::DemuxedBufferMetaData& meta_data);
-
-#ifndef TIZEN_VIDEO_HOLE
- void MediaPacketUpdated(media_packet_h packet);
- void SendFrame(tbm_surface_h surface);
-#endif
-
void ReadDemuxedData(media::DemuxerStream::Type type);
void HandleBufferingMessage(int percent);
base::WeakPtrFactory<MediaSourcePlayerCapi> weak_this_;
player_h player_;
-
- uint32 video_frame_format_;
int media_type_;
double duration_;
double play_rate_;
'base/efl/demuxer_stream_player_params_efl.cc',
'base/efl/demuxer_stream_player_params_efl.h',
'base/efl/demuxer_efl.h',
+ 'base/efl/media_player_efl.cc',
'base/efl/media_player_efl.h',
'base/efl/media_player_bridge_gstreamer.cc',
'base/efl/media_player_bridge_gstreamer.h',