smooth: provide PTS delay
[vlc.git] / modules / stream_filter / smooth / smooth.c
index 7293ab1..3189c32 100644 (file)
@@ -15,7 +15,7 @@
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
@@ -103,7 +103,7 @@ static bool isSmoothStreaming( stream_t *s )
         }
         peeked = FromCharset( encoding, peeked, 512 );
 
-        if( strstr( peeked, needle ) != NULL )
+        if( peeked != NULL && strstr( peeked, needle ) != NULL )
             ret = true;
     }
     free( peeked );
@@ -403,8 +403,9 @@ static int Open( vlc_object_t *p_this )
     p_sys->sms_streams = vlc_array_new();
     p_sys->selected_st = vlc_array_new();
     p_sys->download.chunks = vlc_array_new();
+    p_sys->init_chunks = vlc_array_new();
     if( unlikely( !p_sys->sms_streams || !p_sys->download.chunks ||
-                  !p_sys->selected_st ) )
+                  !p_sys->selected_st || !p_sys->init_chunks ) )
     {
         free( p_sys );
         return VLC_ENOMEM;
@@ -492,14 +493,22 @@ static void Close( vlc_object_t *p_this )
     for( int i = 0; i < vlc_array_count( p_sys->sms_streams ); i++ )
     {
         sms = vlc_array_item_at_index( p_sys->sms_streams, i );
-        if( sms)
+        if( sms )
             sms_Free( sms );
     }
+    /* Free downloaded chunks */
+    chunk_t *chunk;
+    for( int i = 0; i < vlc_array_count( p_sys->init_chunks ); i++ )
+    {
+        chunk = vlc_array_item_at_index( p_sys->init_chunks, i );
+        chunk_Free( chunk );
+    }
 
     sms_queue_free( p_sys->bws );
     vlc_array_destroy( p_sys->sms_streams );
     vlc_array_destroy( p_sys->selected_st );
     vlc_array_destroy( p_sys->download.chunks );
+    vlc_array_destroy( p_sys->init_chunks );
 
     free( p_sys->base_url );
     free( p_sys );
@@ -519,7 +528,7 @@ static chunk_t *get_chunk( stream_t *s, const bool wait )
          * that's why vlc_object_alive() has been deprecated. But if I
          * understood well, there is no good solution with a stream_filter
          * module anyaway. */
-        if( !wait || s->b_die || p_sys->b_error )
+        if( !wait || p_sys->b_error )
         {
             vlc_mutex_unlock( &p_sys->download.lock_wait );
             msg_Warn( s, "get_chunk failed! (playback index %u)",
@@ -729,6 +738,8 @@ static int Control( stream_t *s, int i_query, va_list args )
             *(va_arg( args, bool * )) = true;
             break;
         case STREAM_CAN_FASTSEEK:
+        case STREAM_CAN_PAUSE: /* TODO */
+        case STREAM_CAN_CONTROL_PACE:
             *(va_arg( args, bool * )) = false;
             break;
         case STREAM_GET_POSITION:
@@ -746,6 +757,10 @@ static int Control( stream_t *s, int i_query, va_list args )
         case STREAM_GET_SIZE:
             *(va_arg( args, uint64_t * )) = FAKE_STREAM_SIZE;
             break;
+        case STREAM_GET_PTS_DELAY:
+            *va_arg (args, int64_t *) =
+                var_InheritInteger(s, "network-caching");
+             break;
         default:
             return VLC_EGENERIC;
     }