- if( p_pack->p_vol == NULL )
- {
- uint8_t *p_vol_begin, *p_vol_end, *p_end;
- /* search if p_sout_buffer contains with a vol */
- p_vol_begin = p_sout_buffer->p_buffer;
- p_vol_end = NULL;
- p_end = p_sout_buffer->p_buffer + p_sout_buffer->i_size;
-
- for( ;; )
- {
- if( m4v_FindStartCode( &p_vol_begin, p_end ) )
- {
- break;
- }
- msg_Dbg( p_pack->p_fifo,
- "starcode 0x%2.2x%2.2x%2.2x%2.2x",
- p_vol_begin[0], p_vol_begin[1], p_vol_begin[2], p_vol_begin[3] );
-
- if( ( p_vol_begin[3] & ~VIDEO_OBJECT_MASK ) == ( VIDEO_OBJECT_START_CODE&0xff ) )
- {
- p_vol_end = p_vol_begin + 4;
- if( m4v_FindStartCode( &p_vol_end, p_end ) )
- {
- break;
- }
- if( ( p_vol_end[3] & ~VIDEO_OBJECT_LAYER_MASK ) == ( VIDEO_OBJECT_LAYER_START_CODE&0xff ) )
- {
- p_vol_end += 4;
- if( m4v_FindStartCode( &p_vol_end, p_end ) )
- {
- p_vol_end = p_end;
- }
- }
- else
- {
- p_vol_end = NULL;
- }
- }
- else if( ( p_vol_begin[3] & ~VIDEO_OBJECT_LAYER_MASK ) == ( VIDEO_OBJECT_LAYER_START_CODE&0xff) )
- {
- p_vol_end = p_vol_begin + 4;
- if( m4v_FindStartCode( &p_vol_end, p_end ) )
- {
- p_vol_end = p_end;
- }
- }
-
- if( p_vol_end != NULL && p_vol_begin < p_vol_end )
- {
- BITMAPINFOHEADER *p_bih;
-
- p_pack->i_vol = p_vol_end - p_vol_begin;
- msg_Dbg( p_pack->p_fifo, "Reopening output" );
-
- p_pack->p_vol = malloc( p_pack->i_vol );
- memcpy( p_pack->p_vol, p_vol_begin, p_pack->i_vol );
-
- sout_InputDelete( p_pack->p_sout_input );
-
- p_pack->output_format.i_cat = VIDEO_ES;
- p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'v' );
- p_pack->output_format.p_format =
- (void*)p_bih = malloc( sizeof( BITMAPINFOHEADER ) + p_pack->i_vol);
-
- p_bih->biSize = sizeof( BITMAPINFOHEADER ) + p_pack->i_vol;
- p_bih->biWidth = 0;
- p_bih->biHeight = 0;
- p_bih->biPlanes = 1;
- p_bih->biBitCount = 24;
- p_bih->biCompression = VLC_FOURCC( 'd', 'i', 'v', 'x' );
- p_bih->biSizeImage = 0;
- p_bih->biXPelsPerMeter = 0;
- p_bih->biYPelsPerMeter = 0;
- p_bih->biClrUsed = 0;
- p_bih->biClrImportant = 0;
- memcpy( &p_bih[1], p_pack->p_vol, p_pack->i_vol );
-
- p_pack->p_sout_input =
- sout_InputNew( p_pack->p_fifo,
- &p_pack->output_format );
- if( !p_pack->p_sout_input )
- {
- p_pack->p_fifo->b_error = 1;
- return;
- }
-
- break;
- }
- else
- {
- p_vol_begin += 4;
- }
- }
- }