- block_t *p_pic;
-
- if( !pp_block || !*pp_block )
- 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 );
-
- if( p_sys->p_frame )
- block_ChainRelease( p_sys->p_frame );
- p_sys->p_frame = NULL;
- p_sys->slice.i_frame_type = 0;
- p_sys->b_slice = VLC_FALSE;
- }
- block_Release( *pp_block );
- return NULL;
- }
-
- block_BytestreamPush( &p_sys->bytestream, *pp_block );
-
- for( ;; )
- {
- switch( p_sys->i_state )
- {
- case STATE_NOSYNC:
- /* Skip until 3 byte startcode 0 0 1 */
- if( block_FindStartcodeFromOffset( &p_sys->bytestream,
- &p_sys->i_offset, p_sys->startcode+1, 3 ) == VLC_SUCCESS)
- {
- p_sys->i_state = STATE_NEXT_SYNC;
- }
-
- if( p_sys->i_offset )
- {
- /* skip the data */
- 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:
- /* Find the next 3 byte startcode 0 0 1*/
- if( block_FindStartcodeFromOffset( &p_sys->bytestream,
- &p_sys->i_offset, p_sys->startcode+1, 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 +1 );
- p_pic->i_pts = p_sys->bytestream.p_block->i_pts;
- p_pic->i_dts = p_sys->bytestream.p_block->i_dts;
- /* Force 4 byte startcode 0 0 0 1 */
- p_pic->p_buffer[0] = 0;
-
- block_GetBytes( &p_sys->bytestream, &p_pic->p_buffer[1],
- p_pic->i_buffer-1 );
-
- /* Remove trailing 0 bytes */
- while( p_pic->i_buffer && (!p_pic->p_buffer[p_pic->i_buffer-1] ) )
- p_pic->i_buffer--;
- p_sys->i_offset = 0;
-
- /* Parse the NAL */
- if( !( p_pic = ParseNALBlock( p_dec, p_pic ) ) )
- {
- p_sys->i_state = STATE_NOSYNC;
- break;
- }
-#if 0
- msg_Dbg( p_dec, "pts="I64Fd" dts="I64Fd,
- p_pic->i_pts, p_pic->i_dts );
-#endif
-
- /* So p_block doesn't get re-added several times */
- *pp_block = block_BytestreamPop( &p_sys->bytestream );