- block_t *p_pic;
-
- if( pp_block == NULL || *pp_block == NULL )
- {
- return NULL;
- }
-
- if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
- {
- if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
- {
- p_sys->i_state = STATE_NOSYNC;
- block_BytestreamFlush( &p_sys->bytestream );
-
- p_sys->b_discontinuity = true;
- if( p_sys->p_frame )
- block_ChainRelease( p_sys->p_frame );
- p_sys->p_frame = NULL;
- 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;
-
- block_Release( *pp_block );
- return NULL;
- }
-
-
- block_BytestreamPush( &p_sys->bytestream, *pp_block );
-
- while( 1 )
- {
- switch( p_sys->i_state )
- {
-
- case STATE_NOSYNC:
- if( block_FindStartcodeFromOffset( &p_sys->bytestream,
- &p_sys->i_offset, p_sys->p_startcode, 3 ) == VLC_SUCCESS )
- {
- p_sys->i_state = STATE_NEXT_SYNC;
- }
-
- if( p_sys->i_offset )
- {
- block_SkipBytes( &p_sys->bytestream, p_sys->i_offset );
- p_sys->i_offset = 0;
- block_BytestreamFlush( &p_sys->bytestream );
- }
-
- if( p_sys->i_state != STATE_NEXT_SYNC )
- {
- /* Need more data */
- return NULL;
- }
-
- p_sys->i_offset = 1; /* To find next startcode */
-
- case STATE_NEXT_SYNC:
- /* TODO: If p_block == NULL, flush the buffer without checking the
- * next sync word */
-
- /* Find the next startcode */
- if( block_FindStartcodeFromOffset( &p_sys->bytestream,
- &p_sys->i_offset, p_sys->p_startcode, 3 ) != VLC_SUCCESS )
- {
- /* Need more data */
- return NULL;
- }
-
- /* Get the new fragment and set the pts/dts */
- p_pic = block_New( p_dec, p_sys->i_offset );
- block_BytestreamFlush( &p_sys->bytestream );
- p_pic->i_pts = p_sys->bytestream.p_block->i_pts;
- p_pic->i_dts = p_sys->bytestream.p_block->i_dts;
-
- block_GetBytes( &p_sys->bytestream, p_pic->p_buffer,
- p_pic->i_buffer );
-
- /* don't reuse the same timestamps several times */
- if( p_pic->i_buffer >= 4 && p_pic->p_buffer[3] == 0x00 )
- {
- /* We have a picture start code */
- p_sys->bytestream.p_block->i_pts = 0;
- p_sys->bytestream.p_block->i_dts = 0;
- }
-
- p_sys->i_offset = 0;
-
- /* Get picture if any */
- if( !( p_pic = ParseMPEGBlock( p_dec, p_pic ) ) )
- {
- p_sys->i_state = STATE_NOSYNC;
- break;
- }