]> git.sesse.net Git - vlc/blobdiff - modules/packetizer/mpegvideo.c
invmem: fix a pts issue causing the output to stays black
[vlc] / modules / packetizer / mpegvideo.c
index a0443ddb99dc481d1441d4184f04c6e8dbed2c1c..e841928ff3c12afc3be55f900d878a7b4b9813ff 100644 (file)
@@ -46,7 +46,7 @@
 # include "config.h"
 #endif
 
-#include <vlc/vlc.h>
+#include <vlc_common.h>
 #include <vlc_plugin.h>
 #include <vlc_block.h>
 #include <vlc_codec.h>
 static int  Open ( vlc_object_t * );
 static void Close( vlc_object_t * );
 
-vlc_module_begin();
-    set_category( CAT_SOUT );
-    set_subcategory( SUBCAT_SOUT_PACKETIZER );
-    set_description( _("MPEG-I/II video packetizer") );
-    set_capability( "packetizer", 50 );
-    set_callbacks( Open, Close );
+vlc_module_begin ()
+    set_category( CAT_SOUT )
+    set_subcategory( SUBCAT_SOUT_PACKETIZER )
+    set_description( N_("MPEG-I/II video packetizer") )
+    set_shortname( N_("MPEG Video") )
+    set_capability( "packetizer", 50 )
+    set_callbacks( Open, Close )
 
     add_bool( "packetizer-mpegvideo-sync-iframe", 0, NULL, SYNC_INTRAFRAME_TEXT,
-              SYNC_INTRAFRAME_LONGTEXT, true );
-vlc_module_end();
+              SYNC_INTRAFRAME_LONGTEXT, true )
+vlc_module_end ()
 
 /*****************************************************************************
  * Local prototypes
@@ -262,7 +263,7 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
         if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
         {
             p_sys->i_state = STATE_NOSYNC;
-            block_BytestreamFlush( &p_sys->bytestream );
+            block_BytestreamEmpty( &p_sys->bytestream );
 
             p_sys->b_discontinuity = true;
             if( p_sys->p_frame )
@@ -271,8 +272,10 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
             p_sys->pp_last = &p_sys->p_frame;
             p_sys->b_frame_slice = false;
         }
-//        p_sys->i_interpolated_dts =
-//        p_sys->i_last_ref_pts = 0;
+        p_sys->i_dts = 0;
+        p_sys->i_pts = 0;
+        p_sys->i_interpolated_dts = 0;
+        p_sys->i_last_ref_pts = 0;
 
         block_Release( *pp_block );
         return NULL;
@@ -445,10 +448,21 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
     else if( p_sys->b_frame_slice &&
              (p_frag->p_buffer[3] == 0x00 || p_frag->p_buffer[3] > 0xaf) )
     {
+        const bool b_eos = p_frag->p_buffer[3] == 0xb7;
+
         mtime_t i_duration;
 
+        if( b_eos )
+        {
+            block_ChainLastAppend( &p_sys->pp_last, p_frag );
+            p_frag = NULL;
+        }
+
         p_pic = block_ChainGather( p_sys->p_frame );
 
+        if( b_eos )
+            p_pic->i_flags |= BLOCK_FLAG_END_OF_SEQUENCE;
+
         i_duration = (mtime_t)( 1000000 * p_sys->i_frame_rate_base /
                                 p_sys->i_frame_rate );
 
@@ -563,6 +577,8 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
         cc_Flush( &p_sys->cc );
     }
 
+    if( !p_frag )
+        return p_pic;
     /*
      * Check info of current fragment
      */