- 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;
- }
- block_BytestreamFlush( &p_sys->bytestream );
-
- /* Get the new fragment and set the pts/dts */
- block_t *p_block_bytestream = p_sys->bytestream.p_block;
-
- p_pic = block_New( p_dec, p_sys->i_offset +1 );
- p_pic->i_pts = p_block_bytestream->i_pts;
- p_pic->i_dts = p_block_bytestream->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 */
- p_pic = ParseNALBlock( p_dec, &b_used_ts, p_pic );
- if( b_used_ts )
- {
- p_block_bytestream->i_dts = -1;
- p_block_bytestream->i_pts = -1;
- }
-
- if( !p_pic )
- {
- p_sys->i_state = STATE_NOSYNC;
- break;
- }
-#if 0
- msg_Dbg( p_dec, "pts=%"PRId64" dts=%"PRId64,
- 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 );
-
- p_sys->i_state = STATE_NOSYNC;
-
- return p_pic;
- }
- }