#include "ipc/ipc_logging.h"
#include "media/base/efl/media_player_efl.h"
+#if defined(TIZEN_TBM_SUPPORT)
+#include "media/base/tizen/media_packet_manager.h"
+#endif
+
namespace content {
#if defined(OS_TIZEN_TV)
Send(new MediaPlayerEflMsg_NewTbmBufferAvailable(
GetRoutingID(), player_id, tbm_handle, timestamp));
}
+
+void BrowserMediaPlayerManagerEfl::OnTbmBufferRelease(
+ int player_id, gfx::TbmBufferHandle tbm_handle) {
+ media::MediaPacketManager::GetInstance()->Release(
+ static_cast<tbm_surface_h>(tbm_handle.tbm_surface));
+}
#endif
void BrowserMediaPlayerManagerEfl::OnTimeChanged(int player_id) {
void OnNewTbmBufferAvailable(
int player_id, gfx::TbmBufferHandle tbm_handle,
base::TimeDelta timestamp) override;
+ void OnTbmBufferRelease(
+ int player_id, gfx::TbmBufferHandle tbm_handle);
#endif
// Helper function to handle IPC from RenderMediaPlayerMangaerEfl.
IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_Seek,
GetMediaPlayerManager(render_frame_host),
BrowserMediaPlayerManagerEfl::OnSeek)
+#if defined(TIZEN_TBM_SUPPORT)
+ IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_ReleaseTbmBuffer,
+ GetMediaPlayerManager(render_frame_host),
+ BrowserMediaPlayerManagerEfl::OnTbmBufferRelease)
+#endif
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
int /* player_id */,
gfx::TbmBufferHandle /* Handle */,
base::TimeDelta /* time stamp */)
+
+// Requests to release tbm buffer.
+IPC_MESSAGE_ROUTED2(MediaPlayerEflHostMsg_ReleaseTbmBuffer,
+ int /* player_id */,
+ gfx::TbmBufferHandle /* Handle */)
#endif
// Seek.
#include "base/message_loop/message_loop.h"
#include "content/common/media/efl/media_player_messages_efl.h"
#include "content/renderer/media/efl/webmediaplayer_efl.h"
+#include "media/base/bind_to_current_loop.h"
namespace content {
int player_id, gfx::TbmBufferHandle tbm_handle,
base::TimeDelta timestamp) {
WebMediaPlayerEfl* player = GetMediaPlayer(player_id);
+
if (player)
- player->OnNewTbmBufferAvailable(tbm_handle, timestamp);
+ player->OnNewTbmBufferAvailable(
+ tbm_handle, timestamp,
+ media::BindToCurrentLoop(base::Bind(
+ &RendererMediaPlayerManager::OnTbmBufferRelease,
+ base::Unretained(this), player_id, tbm_handle)));
+}
+
+void RendererMediaPlayerManager::OnTbmBufferRelease(
+ int player_id, gfx::TbmBufferHandle tbm_handle) {
+ DLOG(INFO) << __FUNCTION__
+ << " player_id: " << player_id
+ << ", tbm_handle: " << tbm_handle.tbm_surface;
+ Send(new MediaPlayerEflHostMsg_ReleaseTbmBuffer(routing_id(), player_id,
+ tbm_handle));
}
#endif
#if defined(TIZEN_TBM_SUPPORT)
void OnNewTbmBufferAvailable(int player_id, gfx::TbmBufferHandle tbm_handle,
base::TimeDelta timestamp);
+ void OnTbmBufferRelease(int player_id, gfx::TbmBufferHandle tbm_handle);
#endif
WebMediaPlayerEfl* GetMediaPlayer(int player_id);
}
#if defined(TIZEN_TBM_SUPPORT)
-void WebMediaPlayerEfl::OnNewTbmBufferAvailable(gfx::TbmBufferHandle tbm_handle,
- base::TimeDelta timestamp) {
+void WebMediaPlayerEfl::OnNewTbmBufferAvailable(
+ const gfx::TbmBufferHandle& tbm_handle, base::TimeDelta timestamp,
+ const base::Closure& cb) {
gfx::Size size(gst_width_, gst_height_);
scoped_refptr<VideoFrame> video_frame =
VideoFrame::WrapTBMSurface(size, timestamp, tbm_handle);
-
+ video_frame->AddDestructionObserver(cb);
FrameReady(video_frame);
}
#endif
uint32 length, base::TimeDelta timestamp);
#if defined(TIZEN_TBM_SUPPORT)
- void OnNewTbmBufferAvailable(gfx::TbmBufferHandle tbm_handle,
- base::TimeDelta timestamp);
+ void OnNewTbmBufferAvailable(
+ const gfx::TbmBufferHandle& tbm_handle,
+ base::TimeDelta timestamp,
+ const base::Closure& cb);
#endif
void OnMediaDataChange(int format, int height, int width, int media);
#include "base/memory/singleton.h"
#include "content/public/browser/browser_thread.h"
-namespace {
-
-const base::TimeDelta kCleanUpInterval =
- base::TimeDelta::FromMilliseconds(10000);
-const base::TimeDelta kSurfaceLifetime =
- base::TimeDelta::FromMilliseconds(1000);
-
-} // namespace
-
namespace media {
-void ReleaseTizenSurface(tbm_surface_h internal_surface) {
- MediaPacketManager::GetInstance()->Release(internal_surface);
-}
-
MediaPacketProxy::MediaPacketProxy(media_packet_h handle)
: mediapacket_handle(handle), tbmsurface_handle(nullptr) {
if (MEDIA_PACKET_ERROR_NONE !=
media_packet_get_tbm_surface(mediapacket_handle, &tbmsurface_handle)) {
LOG(ERROR) << "Invalid |mediapacket_handle|: " << handle;
}
- pushed_time = base::Time::Now();
}
MediaPacketProxy::~MediaPacketProxy() {
}
MediaPacketManager::MediaPacketManager() {
- CleanUp();
-}
-
-void MediaPacketManager::CleanUp() {
- for (auto itr = mediapacket_map_.begin(); itr != mediapacket_map_.end();) {
- if (itr->second->pushed_time < base::Time::Now() - kSurfaceLifetime) {
- DLOG(INFO) << "Cleaned: " << itr->second->tbmsurface_handle;
- itr = mediapacket_map_.erase(itr);
- } else {
- ++itr;
- }
- }
-
- content::BrowserThread::PostDelayedTask(
- content::BrowserThread::IO, FROM_HERE,
- base::Bind(&MediaPacketManager::CleanUp, base::Unretained(this)),
- kCleanUpInterval);
}
void MediaPacketManager::DoPush(scoped_ptr<MediaPacketProxy> media_packet) {
#include <unordered_map>
#include "base/memory/scoped_ptr.h"
-#include "base/time/time.h"
#include "media/base/media_export.h"
namespace base {
struct MEDIA_EXPORT MediaPacketProxy final {
media_packet_h mediapacket_handle;
tbm_surface_h tbmsurface_handle;
- base::Time pushed_time;
explicit MediaPacketProxy(media_packet_h handle);
~MediaPacketProxy();
private:
friend struct base::DefaultSingletonTraits<MediaPacketManager>;
MediaPacketManager();
- void CleanUp();
void DoPush(scoped_ptr<MediaPacketProxy> media_packet);
void DoRelease(tbm_surface_h handle);