#include <tizen-video-player.h>
// EXTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/window-devel.h>
#include <dali/devel-api/common/stage.h>
#include <dali/devel-api/threading/mutex.h>
#include <dali/integration-api/debug.h>
mBackgroundColor(Dali::Vector4(1.0f, 1.0f, 1.0f, 0.0f)),
mTargetType(NATIVE_IMAGE),
mPacketMutex(),
- mPacketVector(),
+ mPacketList(),
+ mDeletePacketList(),
mStreamInfo(NULL),
mStreamType(SOUND_STREAM_TYPE_MEDIA),
mCodecType(PLAYER_VIDEO_CODEC_TYPE_EX_DEFAULT),
mSyncActor(actor),
mVideoSizePropertyIndex(Property::INVALID_INDEX),
mSyncMode(syncMode),
- mIsInitForSyncMode(false)
+ mIsInitForSyncMode(false),
+ mFrameId(0)
{
}
{
if(mNativeImageSourcePtr && mTimer)
{
+ mFrameId = 0;
mTimer.Start();
}
{
DALI_LOG_ERROR("Play, player_start() is failed\n");
}
+
}
}
if(mNativeImageSourcePtr && mTimer)
{
mTimer.Stop();
- DestroyPackets();
}
}
}
if(mNativeImageSourcePtr && mTimer)
{
mTimer.Stop();
- DestroyPackets();
}
}
}
}
}
-bool TizenVideoPlayer::Update()
+void TizenVideoPlayer::FrameCallback(int32_t frameId)
{
- Dali::Mutex::ScopedLock lock(mPacketMutex);
-
- int error;
-
- if(mPacket != NULL)
+ Dali::Mutex::ScopedLock lock( mPacketMutex );
+ if(mFrameId == frameId)
{
- error = media_packet_destroy(mPacket);
- if(error != MEDIA_PACKET_ERROR_NONE)
+ if(!mPacketList.empty())
{
- DALI_LOG_ERROR("Update, media_packet_destroy() is failed\n");
- }
- mPacket = NULL;
- }
+ mPacket = static_cast< media_packet_h >( mPacketList.front() );
+ mPacketList.pop_front();
- if(!mPacketVector.Empty())
- {
- mPacket = static_cast<media_packet_h>(mPacketVector[0]);
- mPacketVector.Remove(mPacketVector.Begin());
- }
+ if( mPacket == NULL )
+ {
+ return;
+ }
- if(mPacket == NULL)
- {
- return true;
- }
+ int error = media_packet_get_tbm_surface( mPacket, &mTbmSurface );
+ if( error != MEDIA_PACKET_ERROR_NONE )
+ {
+ media_packet_destroy( mPacket );
+ mPacket = NULL;
+ DALI_LOG_ERROR( " error: %d\n", error );
+ return;
+ }
+ Any source( mTbmSurface );
+ mNativeImageSourcePtr->SetSource( source );
- error = media_packet_get_tbm_surface(mPacket, &mTbmSurface);
- if(error != MEDIA_PACKET_ERROR_NONE)
- {
- media_packet_destroy(mPacket);
- mPacket = NULL;
- DALI_LOG_ERROR(" error: %d\n", error);
- return true;
+ if(!mDeletePacketList.empty())
+ {
+ media_packet_h packet = static_cast< media_packet_h >( mDeletePacketList.front() );
+ int error = media_packet_destroy( packet );
+ if(error != MEDIA_PACKET_ERROR_NONE)
+ {
+ DALI_LOG_ERROR("Update, media_packet_destroy() is failed\n");
+ }
+ mDeletePacketList.pop_front();
+ }
+ mDeletePacketList.push_back(mPacket);
+ }
+ mFrameId = 0;
}
+}
+
+bool TizenVideoPlayer::Update()
+{
+ Dali::Mutex::ScopedLock lock(mPacketMutex);
- Any source(mTbmSurface);
- mNativeImageSourcePtr->SetSource(source);
+ DevelWindow::AddFrameRenderedCallback(DevelWindow::Get(mSyncActor), std::unique_ptr<CallbackBase>(MakeCallback(this, &TizenVideoPlayer::FrameCallback)), ++mFrameId);
Dali::Stage::GetCurrent().KeepRendering(0.0f);
return true;
void TizenVideoPlayer::DestroyPackets()
{
+ Dali::Mutex::ScopedLock lock( mPacketMutex );
int error;
- if(mPacket != NULL)
+
+ if(mNativeImageSourcePtr)
+ {
+ Any source( NULL );
+ mNativeImageSourcePtr->SetSource( source );
+ }
+
+ std::list<media_packet_h>::iterator dIter = mDeletePacketList.begin();
+ for (; dIter != mDeletePacketList.end(); ++dIter)
{
- error = media_packet_destroy(mPacket);
- DALI_LOG_ERROR("Media packet destroy error: %d\n", error);
+ mPacket = *dIter;
+ error = media_packet_destroy( mPacket );
+ DALI_LOG_ERROR( "Media packet destroy error: %d\n", error );
mPacket = NULL;
}
- for(unsigned int i = 0; i < mPacketVector.Size(); ++i)
+ std::list<media_packet_h>::iterator iter = mPacketList.begin();
+ for (; iter != mPacketList.end(); ++iter)
{
- mPacket = static_cast<media_packet_h>(mPacketVector[i]);
- error = media_packet_destroy(mPacket);
- DALI_LOG_ERROR("Media packet destroy error: %d\n", error);
+ mPacket = *iter;
+ error = media_packet_destroy( mPacket );
+ DALI_LOG_ERROR( "Media packet destroy error: %d\n", error );
mPacket = NULL;
}
- mPacketVector.Clear();
+
+ mPacketList.clear();
+ mDeletePacketList.clear();
+
}
void TizenVideoPlayer::PushPacket(media_packet_h packet)
{
Dali::Mutex::ScopedLock lock(mPacketMutex);
- mPacketVector.PushBack(packet);
+ mPacketList.push_back(packet);
}
void TizenVideoPlayer::SetDisplayArea(DisplayArea area)
int ret = 0;
int error;
+
if(mPlayerState != PLAYER_STATE_NONE)
{
GetPlayerState(&mPlayerState);
mPlayerState = PLAYER_STATE_NONE;
mPlayer = NULL;
}
+
+ DestroyPackets();
}
void TizenVideoPlayer::SetCodecType(Dali::VideoPlayerPlugin::CodecType type)