vlc | branch: master | Steve Lhomme <[email protected]> | Wed Jun 15 00:39:16 
2016 +0200| [c3348c4bbe00e2001272faa1e5c9ab3f0ec0c267] | committer: 
Jean-Baptiste Kempf

chromecast: delay the Demux() call until the Chromecast is ready to receive data

Otherwise we start sending data while the connection is being established and
we miss the beginning of the file.

Signed-off-by: Jean-Baptiste Kempf <[email protected]>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c3348c4bbe00e2001272faa1e5c9ab3f0ec0c267
---

 modules/stream_out/chromecast/chromecast.h         |    4 ++++
 modules/stream_out/chromecast/chromecast_common.h  |    2 ++
 modules/stream_out/chromecast/chromecast_ctrl.cpp  |   17 +++++++++++++++++
 modules/stream_out/chromecast/chromecast_demux.cpp |   10 ++++++++++
 4 files changed, 33 insertions(+)

diff --git a/modules/stream_out/chromecast/chromecast.h 
b/modules/stream_out/chromecast/chromecast.h
index 4e10858..53557ef 100644
--- a/modules/stream_out/chromecast/chromecast.h
+++ b/modules/stream_out/chromecast/chromecast.h
@@ -130,6 +130,8 @@ private:
         }
     }
 
+    void waitAppStarted();
+
     int connectChromecast();
     void disconnectChromecast();
 
@@ -225,6 +227,8 @@ private:
     static void set_length(void*, mtime_t length);
     static mtime_t get_time(void*);
     static double get_position(void*);
+
+    static void wait_app_started(void*);
 };
 
 #endif /* VLC_CHROMECAST_H */
diff --git a/modules/stream_out/chromecast/chromecast_common.h 
b/modules/stream_out/chromecast/chromecast_common.h
index cfab0bf..a86f2b6 100644
--- a/modules/stream_out/chromecast/chromecast_common.h
+++ b/modules/stream_out/chromecast/chromecast_common.h
@@ -38,6 +38,8 @@ typedef struct
     void (*pf_set_length)(void*, mtime_t length);
     mtime_t (*pf_get_time)(void*);
     double (*pf_get_position)(void*);
+
+    void (*pf_wait_app_started)(void*);
 } chromecast_common;
 
 # ifdef __cplusplus
diff --git a/modules/stream_out/chromecast/chromecast_ctrl.cpp 
b/modules/stream_out/chromecast/chromecast_ctrl.cpp
index 840c043..3d690c0 100644
--- a/modules/stream_out/chromecast/chromecast_ctrl.cpp
+++ b/modules/stream_out/chromecast/chromecast_ctrl.cpp
@@ -121,6 +121,7 @@ intf_sys_t::intf_sys_t(vlc_object_t * const p_this, int 
port, std::string device
     common.pf_get_position     = get_position;
     common.pf_get_time         = get_time;
     common.pf_set_length       = set_length;
+    common.pf_wait_app_started = wait_app_started;
 
     assert( var_Type( p_module->p_parent->p_parent, CC_SHARED_VAR_NAME) == 0 );
     if (var_Create( p_module->p_parent->p_parent, CC_SHARED_VAR_NAME, 
VLC_VAR_ADDRESS ) == VLC_SUCCESS )
@@ -976,6 +977,16 @@ void intf_sys_t::requestPlayerSeek()
     notifySendRequest();
 }
 
+void intf_sys_t::waitAppStarted()
+{
+    vlc_mutex_locker locker(&lock);
+    mutex_cleanup_push(&lock);
+    while ( conn_status != CHROMECAST_APP_STARTED &&
+            conn_status != CHROMECAST_CONNECTION_DEAD )
+        vlc_cond_wait(&loadCommandCond, &lock);
+    vlc_cleanup_pop();
+}
+
 mtime_t intf_sys_t::get_time(void *pt)
 {
     intf_sys_t *p_this = reinterpret_cast<intf_sys_t*>(pt);
@@ -995,3 +1006,9 @@ void intf_sys_t::set_length(void *pt, mtime_t length)
     intf_sys_t *p_this = reinterpret_cast<intf_sys_t*>(pt);
     p_this->i_length = length;
 }
+
+void intf_sys_t::wait_app_started(void *pt)
+{
+    intf_sys_t *p_this = reinterpret_cast<intf_sys_t*>(pt);
+    p_this->waitAppStarted();
+}
diff --git a/modules/stream_out/chromecast/chromecast_demux.cpp 
b/modules/stream_out/chromecast/chromecast_demux.cpp
index 9378a7e..aa4968a 100644
--- a/modules/stream_out/chromecast/chromecast_demux.cpp
+++ b/modules/stream_out/chromecast/chromecast_demux.cpp
@@ -41,6 +41,7 @@ struct demux_sys_t
     demux_sys_t(demux_t * const demux, chromecast_common * const renderer)
         :p_demux(demux)
         ,p_renderer(renderer)
+        ,demuxReady(false)
     {
     }
 
@@ -69,12 +70,21 @@ struct demux_sys_t
 
     int Demux()
     {
+        if (!demuxReady)
+        {
+            msg_Dbg(p_demux, "wait to demux");
+            p_renderer->pf_wait_app_started( p_renderer->p_opaque );
+            demuxReady = true;
+            msg_Dbg(p_demux, "ready to demux");
+        }
+
         return demux_Demux( p_demux->p_next );
     }
 
 protected:
     demux_t     * const p_demux;
     chromecast_common  * const p_renderer;
+    bool          demuxReady;
 };
 
 static int Demux( demux_t *p_demux_filter )

_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to