[MM][MSE] Fix crash when clicking another clip while video playing in youtube
authorkarthick.m1 <karthick.m1@samsung.com>
Wed, 16 Dec 2015 16:23:49 +0000 (21:53 +0530)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 07:55:23 +0000 (07:55 +0000)
Crash happens, because media packet comes after player destroyed.
This patch introduces WeaKPointer not to make task outlive player.

Reference: http://165.213.202.130/gerrit/94565/

Bug: http://web.sec.samsung.net/bugzilla/show_bug.cgi?id=14678

Reviewed by: sm.venugopal, sns.park

Change-Id: I9c666dcf2bc2bb44a601e15a5395548b695701cf
Signed-off-by: karthick.m1 <karthick.m1@samsung.com>
tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.cc
tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.h

index 6bee35431f70edb8e55fb2210533967ed793654e..8ef1e924e2569bc3770523d575ac4a4b89e67cb8 100644 (file)
@@ -139,11 +139,6 @@ static void OnMediaPacketDecoded(media_packet_h packet, void* data) {
   }
 
   MediaSourcePlayerCapi* player = static_cast<MediaSourcePlayerCapi*>(data);
-  if (!player || player->IsPlayerDestructing()) {
-    media_packet_destroy(packet);
-    LOG(ERROR) << "media_packet_decoded_cb - player handle is null";
-    return;
-  }
   player->OnMediaPacketUpdated(packet);
 }
 #endif
@@ -214,7 +209,8 @@ MediaSourcePlayerCapi::MediaSourcePlayerCapi(
       media_packet_(NULL),
 #endif
       audio_format_(NULL),
-      video_format_(NULL) {
+      video_format_(NULL),
+      weak_factory_(this) {
   demuxer_->Initialize(this);
   audio_buffer_queue_.clear();
   video_buffer_queue_.clear();
@@ -448,7 +444,7 @@ void MediaSourcePlayerCapi::MoveAndresizeWindow(int x, int y, int width,
 void MediaSourcePlayerCapi::OnMediaPacketUpdated(media_packet_h packet) {
   task_runner_->PostTask(
       FROM_HERE, base::Bind(&MediaSourcePlayerCapi::DeliverMediaPacket,
-                            base::Unretained(this), packet));
+                            weak_factory_.GetWeakPtr(), packet));
 }
 #endif  // TIZEN_VIDEO_HOLE
 
@@ -555,6 +551,7 @@ void MediaSourcePlayerCapi::Destroy() {
   destructing_ = true;
   Release();
   player_destroy(player_);
+  player_ = NULL;
   task_runner_->DeleteSoon(FROM_HERE, this);
 }
 
@@ -572,6 +569,7 @@ void MediaSourcePlayerCapi::Release() {
   video_buffer_queue_.clear();
   if (player_) {
     player_unset_completed_cb(player_);
+    player_unset_media_packet_video_frame_decoded_cb(player_);
     player_unprepare(player_);
   }
   manager()->OnSuspendComplete(GetPlayerId());
@@ -584,8 +582,6 @@ void MediaSourcePlayerCapi::Release() {
 
 void MediaSourcePlayerCapi::OnDemuxerConfigsAvailable(
     const DemuxerConfigs& configs) {
-  if (IsPlayerDestructing())
-    return;
 
   if (!player_)
     return;
@@ -775,11 +771,11 @@ void MediaSourcePlayerCapi::HandleUnderFlowStatus(
     if (player_prepared_) {
       task_runner_->PostTask(
           FROM_HERE, base::Bind(&MediaSourcePlayerCapi::Pause,
-                                base::Unretained(this), true));
+                                weak_factory_.GetWeakPtr(), true));
     }
     task_runner_->PostTask(
         FROM_HERE, base::Bind(&MediaSourcePlayerCapi::ReadDemuxedData,
-                              base::Unretained(this), type));
+                              weak_factory_.GetWeakPtr(), type));
   } else if (!underflow_status) {
     if (type == media::DemuxerStream::VIDEO) {
       should_feed_video_ = underflow_status;
@@ -796,7 +792,7 @@ void MediaSourcePlayerCapi::HandleUnderFlowStatus(
         (!should_feed_video_ || eos_video_)) {
       task_runner_->PostTask(
           FROM_HERE, base::Bind(&MediaSourcePlayerCapi::Play,
-                                base::Unretained(this)));
+                                weak_factory_.GetWeakPtr()));
     }
   }
 }
@@ -1136,25 +1132,25 @@ void MediaSourcePlayerCapi::HandleError(
 void MediaSourcePlayerCapi::OnPrepareComplete() {
   task_runner_->PostTask(
       FROM_HERE, base::Bind(&MediaSourcePlayerCapi::PrepareComplete,
-                            base::Unretained(this)));
+                            weak_factory_.GetWeakPtr()));
 }
 
 void MediaSourcePlayerCapi::OnPlaybackComplete() {
   task_runner_->PostTask(
       FROM_HERE, base::Bind(&MediaSourcePlayerCapi::PlaybackComplete,
-                            base::Unretained(this)));
+                            weak_factory_.GetWeakPtr()));
 }
 
 void MediaSourcePlayerCapi::OnSeekComplete() {
   task_runner_->PostTask(
       FROM_HERE, base::Bind(&MediaSourcePlayerCapi::SeekComplete,
-                            base::Unretained(this)));
+                            weak_factory_.GetWeakPtr()));
 }
 
 void MediaSourcePlayerCapi::OnHandleBufferingMessage(int percent) {
   task_runner_->PostTask(
       FROM_HERE, base::Bind(&MediaSourcePlayerCapi::HandleBufferingMessage,
-                            base::Unretained(this),
+                            weak_factory_.GetWeakPtr(),
                             percent));
 }
 
@@ -1167,7 +1163,7 @@ void MediaSourcePlayerCapi::OnReadDemuxedData(
 
   task_runner_->PostTask(
       FROM_HERE, base::Bind(&MediaSourcePlayerCapi::ReadDemuxedData,
-                            base::Unretained(this), type));
+                            weak_factory_.GetWeakPtr(), type));
 }
 
 void MediaSourcePlayerCapi::OnUpdateDataStatus(
@@ -1179,7 +1175,7 @@ void MediaSourcePlayerCapi::OnUpdateDataStatus(
 
   task_runner_->PostTask(
       FROM_HERE, base::Bind(&MediaSourcePlayerCapi::HandleUnderFlowStatus,
-                            base::Unretained(this),
+                            weak_factory_.GetWeakPtr(),
                             type,
                             underflow_status));
 }
@@ -1187,7 +1183,7 @@ void MediaSourcePlayerCapi::OnUpdateDataStatus(
 void MediaSourcePlayerCapi::OnPlayerError(int error_code, const char* msg) {
   task_runner_->PostTask(
       FROM_HERE, base::Bind(&MediaSourcePlayerCapi::HandlePlayerError,
-                            base::Unretained(this), error_code, msg));
+                            weak_factory_.GetWeakPtr(), error_code, msg));
 }
 
 }  // namespace media
index 65ca487fe072a450544eceb6e893f4a790d25f91..4bb75ace9f9cb35cd37b8a2ba767b51c0e52a98e 100644 (file)
@@ -151,6 +151,8 @@ class MEDIA_EXPORT MediaSourcePlayerCapi
   std::deque<scoped_refptr<DecoderBuffer> > audio_buffer_queue_;
   std::deque<scoped_refptr<DecoderBuffer> > video_buffer_queue_;
 
+  base::WeakPtrFactory<MediaSourcePlayerCapi> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(MediaSourcePlayerCapi);
 };