- p_sout_buffer->i_length = (mtime_t)1000000 *
- (mtime_t)p_pack->i_frame_size /
- (mtime_t)p_pack->i_sample_rate;
- p_sout_buffer->i_bitrate = 0;
- p_sout_buffer->i_dts = i_pts;
- p_sout_buffer->i_pts = i_pts;
+ /* Check if frame is valid and get frame info */
+ p_sys->i_frame_size = ADTSSyncInfo( p_dec, p_header,
+ &p_sys->i_channels,
+ &p_sys->i_rate,
+ &p_sys->i_frame_length,
+ &p_sys->i_header_size,
+ &p_sys->i_raw_blocks );
+ if( p_sys->i_frame_size <= 0 )
+ {
+ msg_Dbg( p_dec, "emulated sync word" );
+ block_SkipByte( &p_sys->bytestream );
+ p_sys->i_state = STATE_NOSYNC;
+ break;
+ }
+
+ p_sys->i_state = STATE_NEXT_SYNC;
+
+ case STATE_NEXT_SYNC:
+ /* TODO: If p_block == NULL, flush the buffer without checking the
+ * next sync word */
+
+ /* Check if next expected frame contains the sync word */
+ if( block_PeekOffsetBytes( &p_sys->bytestream, p_sys->i_frame_size
+ + p_sys->i_header_size, p_header, 2 )
+ != VLC_SUCCESS )
+ {
+ /* Need more data */
+ return NULL;
+ }
+
+ if( p_header[0] != 0xff || (p_header[1] & 0xf6) != 0xf0 )
+ {
+ msg_Dbg( p_dec, "emulated sync word "
+ "(no sync on following frame)" );
+ p_sys->i_state = STATE_NOSYNC;
+ block_SkipByte( &p_sys->bytestream );
+ break;
+ }
+
+ p_sys->i_state = STATE_SEND_DATA;
+ break;
+
+ case STATE_GET_DATA:
+ /* Make sure we have enough data.
+ * (Not useful if we went through NEXT_SYNC) */
+ if( block_WaitBytes( &p_sys->bytestream, p_sys->i_frame_size +
+ p_sys->i_header_size) != VLC_SUCCESS )
+ {
+ /* Need more data */
+ return NULL;
+ }
+ p_sys->i_state = STATE_SEND_DATA;
+
+ case STATE_SEND_DATA:
+ if( !(p_buf = GetOutBuffer( p_dec, &p_out_buffer )) )
+ {
+ //p_dec->b_error = VLC_TRUE;
+ return NULL;
+ }