Browse Source

codec: don't drop blocks marked BLOCK_FLAG_DISCONTINUITY

If blocks are marked BLOCK_FLAG_DISCONTINUITY then do not drop them,
unless BLOCK_FLAGS_CORRUPTED is set. Instead flush old blocks from decoder
queue and restart at this new stream access point (new timeline).

Signed-off-by: Ilkka Ollakka <ileoo@videolan.org>
pull/35/head
Jean-Paul Saman 11 years ago
committed by Ilkka Ollakka
parent
commit
48a867c768
  1. 16
      modules/codec/a52.c
  2. 10
      modules/codec/adpcm.c
  3. 10
      modules/codec/aes3.c
  4. 6
      modules/codec/araw.c
  5. 6
      modules/codec/arib/aribsub.c
  6. 4
      modules/codec/avcodec/audio.c
  7. 12
      modules/codec/avcodec/subtitle.c
  8. 5
      modules/codec/avcodec/video.c
  9. 14
      modules/codec/bpg.c
  10. 5
      modules/codec/cdg.c
  11. 3
      modules/codec/crystalhd.c
  12. 6
      modules/codec/cvdsub.c
  13. 1
      modules/codec/ddummy.c
  14. 16
      modules/codec/dts.c
  15. 12
      modules/codec/dvbsub.c
  16. 11
      modules/codec/faad.c
  17. 11
      modules/codec/flac.c
  18. 7
      modules/codec/fluidsynth.c
  19. 10
      modules/codec/g711.c
  20. 6
      modules/codec/jpeg.c
  21. 1
      modules/codec/kate.c
  22. 5
      modules/codec/libass.c
  23. 9
      modules/codec/lpcm.c
  24. 4
      modules/codec/mft.c
  25. 21
      modules/codec/mpeg_audio.c
  26. 5
      modules/codec/mpg123.c
  27. 4
      modules/codec/omxil/omxil.c
  28. 22
      modules/codec/opus.c
  29. 3
      modules/codec/rawvideo.c
  30. 2
      modules/codec/schroedinger.c
  31. 3
      modules/codec/speex.c
  32. 6
      modules/codec/spudec/spudec.c
  33. 3
      modules/codec/stl.c
  34. 9
      modules/codec/subsdec.c
  35. 3
      modules/codec/substtml.c
  36. 3
      modules/codec/subsusf.c
  37. 14
      modules/codec/theora.c
  38. 12
      modules/codec/uleaddvaudio.c
  39. 16
      modules/codec/vorbis.c
  40. 13
      modules/codec/wmafixed/wma.c

16
modules/codec/a52.c

@ -174,26 +174,24 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( !pp_block || !*pp_block ) return NULL;
if( (*pp_block)->i_flags&(BLOCK_FLAG_CORRUPTED) )
if( (*pp_block)->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED) )
{
if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
date_Set( &p_sys->end_date, 0 );
if( (*pp_block)->i_flags & BLOCK_FLAG_CORRUPTED )
{
p_sys->i_state = STATE_NOSYNC;
block_BytestreamEmpty( &p_sys->bytestream );
block_Release( *pp_block );
*pp_block = NULL;
return NULL;
}
date_Set( &p_sys->end_date, 0 );
block_Release( *pp_block );
return NULL;
}
if( (*pp_block)->i_flags & BLOCK_FLAG_DISCONTINUITY )
{
date_Set( &p_sys->end_date, 0 );
}
if( !date_Get( &p_sys->end_date ) && (*pp_block)->i_pts <= VLC_TS_INVALID)
{
/* We've just started the stream, wait for the first PTS. */
block_Release( *pp_block );
*pp_block = NULL;
return NULL;
}

10
modules/codec/adpcm.c

@ -276,6 +276,16 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( !pp_block || !*pp_block ) return NULL;
p_block = *pp_block;
*pp_block = NULL; /* So the packet doesn't get re-sent */
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
return NULL;
}
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->end_date, 0 );
if( p_block->i_pts > VLC_TS_INVALID &&
p_block->i_pts != date_Get( &p_sys->end_date ) )

10
modules/codec/aes3.c

@ -310,6 +310,15 @@ static block_t *Parse( decoder_t *p_dec, int *pi_frame_length, int *pi_bits,
p_block = *pp_block;
*pp_block = NULL; /* So the packet doesn't get re-sent */
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
return NULL;
}
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->end_date, 0 );
/* Date management */
if( p_block->i_pts > VLC_TS_INVALID &&
p_block->i_pts != date_Get( &p_sys->end_date ) )
@ -371,4 +380,3 @@ static block_t *Parse( decoder_t *p_dec, int *pi_frame_length, int *pi_bits,
*pi_bits = i_bits;
return p_block;
}

6
modules/codec/araw.c

@ -314,6 +314,12 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
return NULL;
*pp_block = NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
goto skip;
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->end_date, 0 );
if( p_block->i_pts > VLC_TS_INVALID &&
p_block->i_pts != date_Get( &p_sys->end_date ) )
{

6
modules/codec/arib/aribsub.c

@ -173,6 +173,12 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
}
p_block = *pp_block;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
return NULL;
}
arib_parser_t *p_parser = arib_get_parser( p_sys->p_arib_instance );
arib_decoder_t *p_decoder = arib_get_decoder( p_sys->p_arib_instance );
if ( p_parser && p_decoder )

4
modules/codec/avcodec/audio.c

@ -261,7 +261,7 @@ static block_t *DecodeAudio( decoder_t *p_dec, block_t **pp_block )
if( p_sys->b_delayed_open )
goto end;
if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
avcodec_flush_buffers( ctx );
date_Set( &p_sys->end_date, VLC_TS_INVALID );
@ -272,9 +272,9 @@ static block_t *DecodeAudio( decoder_t *p_dec, block_t **pp_block )
goto end;
}
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
{
avcodec_flush_buffers( ctx );
date_Set( &p_sys->end_date, VLC_TS_INVALID );
}

12
modules/codec/avcodec/subtitle.c

@ -124,13 +124,13 @@ static subpicture_t *DecodeSubtitle(decoder_t *dec, block_t **block_ptr)
block_t *block = *block_ptr;
if (block->i_flags & (BLOCK_FLAG_CORRUPTED)) {
block_Release(block);
avcodec_flush_buffers(sys->p_context);
return NULL;
if (block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED)) {
if (block->i_flags & BLOCK_FLAG_CORRUPTED) {
avcodec_flush_buffers(sys->p_context);
block_Release(block);
return NULL;
}
}
if (block->i_flags & BLOCK_FLAG_DISCONTINUITY)
avcodec_flush_buffers(sys->p_context);
if (block->i_buffer <= 0) {
block_Release(block);

5
modules/codec/avcodec/video.c

@ -516,12 +516,13 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
p_sys->i_pts = VLC_TS_INVALID; /* To make sure we recover properly */
p_sys->i_late_frames = 0;
#if 0
/* NOTE: data is good only the timeline changed so do not flush decoder */
post_mt( p_sys );
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
avcodec_flush_buffers( p_context );
wait_mt( p_sys );
#endif
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );

14
modules/codec/bpg.c

@ -96,18 +96,13 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
BPGImageInfo img_info;
if( !pp_block || !*pp_block )
{
return NULL;
}
p_block = *pp_block;
*pp_block = NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release(p_block);
*pp_block = NULL;
return NULL;
}
goto error;
/* Decode picture */
@ -163,15 +158,10 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
p_pic->date = p_block->i_pts > VLC_TS_INVALID ? p_block->i_pts : p_block->i_dts;
block_Release( p_block );
*pp_block = NULL;
return p_pic;
error:
block_Release( p_block );
*pp_block = NULL;
return NULL;
}

5
modules/codec/cdg.c

@ -143,7 +143,7 @@ static picture_t *Decode( decoder_t *p_dec, block_t **pp_block )
return NULL;
p_block = *pp_block;
if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
p_sys->i_packet = 0;
goto exit;
@ -170,7 +170,8 @@ static picture_t *Decode( decoder_t *p_dec, block_t **pp_block )
}
exit:
block_Release( p_block ); *pp_block = NULL;
block_Release( p_block );
*pp_block = NULL;
return p_pic;
}

3
modules/codec/crystalhd.c

@ -443,10 +443,9 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
p_block = *pp_block;
if( p_block )
{
if( ( p_block->i_flags&(BLOCK_FLAG_CORRUPTED) ) == 0 )
if( ( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) ) == 0 )
{
/* Valid input block, so we can send to HW to decode */
BC_STATUS status = BC_FUNC_PSYS(DtsProcInput)( p_sys->bcm_handle,
p_block->p_buffer,
p_block->i_buffer,

6
modules/codec/cvdsub.c

@ -169,6 +169,12 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
p_block = *pp_block;
*pp_block = NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
return NULL;
}
if( !(p_spu = Reassemble( p_dec, p_block )) ) return NULL;
/* Parse and decode */

1
modules/codec/ddummy.c

@ -127,6 +127,7 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( !pp_block || !*pp_block ) return NULL;
p_block = *pp_block;
*pp_block = NULL;
if( stream != NULL
&& p_block->i_buffer > 0

16
modules/codec/dts.c

@ -174,16 +174,18 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( !pp_block || !*pp_block )
return NULL;
if( (*pp_block)->i_flags&(BLOCK_FLAG_CORRUPTED) )
if( (*pp_block)->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
{
p_sys->i_state = STATE_NOSYNC;
block_BytestreamEmpty( &p_sys->bytestream );
date_Set( &p_sys->end_date, 0 );
block_Release( *pp_block );
return NULL;
if( (*pp_block)->i_flags & BLOCK_FLAG_CORRUPTED )
{
p_sys->i_state = STATE_NOSYNC;
block_BytestreamEmpty( &p_sys->bytestream );
block_Release( *pp_block );
*pp_block = NULL;
return NULL;
}
}
if( (*pp_block)->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->end_date, 0 );
if( !date_Get( &p_sys->end_date ) && (*pp_block)->i_pts <= VLC_TS_INVALID )
{

12
modules/codec/dvbsub.c

@ -402,9 +402,19 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
p_block = *pp_block;
*pp_block = NULL;
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED) )
{
p_sys->i_pts = VLC_TS_INVALID;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
return NULL;
}
}
/* configure for SD res in case DDS is not present */
/* a change of PTS is a good indication we must get a new DDS */
if (p_sys->i_pts != p_block->i_pts)
if( p_sys->i_pts != p_block->i_pts )
default_dds_init( p_dec );
p_sys->i_pts = p_block->i_pts;

11
modules/codec/faad.c

@ -209,11 +209,16 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( !pp_block || !*pp_block ) return NULL;
p_block = *pp_block;
*pp_block = NULL;
if( p_block->i_flags&(BLOCK_FLAG_CORRUPTED) )
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED) )
{
block_Release( p_block );
return NULL;
date_Set( &p_sys->date, 0 );
if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
{
block_Release( p_block );
return NULL;
}
}
/* Remove ADTS header if we have decoder specific config */

11
modules/codec/flac.c

@ -500,10 +500,15 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( !pp_block || !*pp_block )
return NULL;
if( (*pp_block)->i_flags&(BLOCK_FLAG_CORRUPTED) )
if( (*pp_block)->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED) )
{
block_Release( *pp_block );
return NULL;
date_Set( &p_sys->end_date, 0 );
if( (*pp_block)->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( *pp_block );
*pp_block = NULL;
return NULL;
}
}
if( !p_sys->b_stream_info )

7
modules/codec/fluidsynth.c

@ -208,12 +208,17 @@ static block_t *DecodeBlock (decoder_t *p_dec, block_t **pp_block)
if (p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED))
{
date_Set (&p_sys->end_date, 0);
date_Set (&p_sys->end_date, VLC_TS_INVALID);
//fluid_synth_system_reset (p_sys->synth);
fluid_synth_program_reset (p_sys->synth);
for (unsigned channel = 0; channel < 16; channel++)
for (unsigned note = 0; note < 128; note++)
fluid_synth_noteoff (p_sys->synth, channel, note);
if (p_block->i_flags & BLOCK_FLAG_CORRUPTED)
{
block_Release(p_block);
return NULL;
}
}
if (p_block->i_pts > VLC_TS_INVALID && !date_Get (&p_sys->end_date))

10
modules/codec/g711.c

@ -219,9 +219,19 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( pp_block == NULL )
return NULL;
block_t *p_block = *pp_block;
*pp_block = NULL;
if( p_block == NULL )
return NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block);
return NULL;
}
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->end_date, 0 );
if( p_block->i_pts > VLC_TS_INVALID &&
p_block->i_pts != date_Get( &p_sys->end_date ) )
{

6
modules/codec/jpeg.c

@ -198,11 +198,11 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
}
p_block = *pp_block;
*pp_block = NULL;
if (p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release(p_block);
*pp_block = NULL;
return NULL;
}
@ -261,8 +261,6 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
p_pic->date = p_block->i_pts > VLC_TS_INVALID ? p_block->i_pts : p_block->i_dts;
block_Release(p_block);
*pp_block = NULL;
return p_pic;
error:
@ -271,8 +269,6 @@ error:
free(p_row_pointers);
block_Release(p_block);
*pp_block = NULL;
return NULL;
}

1
modules/codec/kate.c

@ -468,6 +468,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
return NULL;
p_block = *pp_block;
*pp_block = NULL;
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
{

5
modules/codec/libass.c

@ -307,13 +307,14 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
return NULL;
p_block = *pp_block;
if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
*pp_block = NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
p_sys->i_max_stop = VLC_TS_INVALID;
block_Release( p_block );
return NULL;
}
*pp_block = NULL;
if( p_block->i_buffer == 0 || p_block->p_buffer[0] == '\0' )
{

9
modules/codec/lpcm.c

@ -327,6 +327,15 @@ static block_t *DecodeFrame( decoder_t *p_dec, block_t **pp_block )
p_block = *pp_block;
*pp_block = NULL; /* So the packet doesn't get re-sent */
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->end_date, 0 );
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
return NULL;
}
/* Date management */
if( p_block->i_pts > VLC_TS_INVALID &&
p_block->i_pts != date_Get( &p_sys->end_date ) )

4
modules/codec/mft.c

@ -780,6 +780,7 @@ static void *DecodeSync(decoder_t *p_dec, block_t **pp_block)
if (p_block->i_flags & (BLOCK_FLAG_CORRUPTED))
{
block_Release(p_block);
*pp_block = NULL;
return NULL;
}
@ -802,6 +803,7 @@ error:
msg_Err(p_dec, "Error in DecodeSync()");
if (p_block)
block_Release(p_block);
*pp_block = NULL;
return NULL;
}
@ -842,6 +844,7 @@ static void *DecodeAsync(decoder_t *p_dec, block_t **pp_block)
if (p_block->i_flags & (BLOCK_FLAG_CORRUPTED))
{
block_Release(p_block);
*pp_block = NULL;
return NULL;
}
@ -896,6 +899,7 @@ static void *DecodeAsync(decoder_t *p_dec, block_t **pp_block)
error:
msg_Err(p_dec, "Error in DecodeAsync()");
block_Release(p_block);
*pp_block = NULL;
return NULL;
}

21
modules/codec/mpeg_audio.c

@ -200,18 +200,19 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
block_t *p_block = pp_block ? *pp_block : NULL;
if (p_block) {
if( p_block->i_flags&(BLOCK_FLAG_CORRUPTED) )
{
p_sys->i_state = STATE_NOSYNC;
block_BytestreamEmpty( &p_sys->bytestream );
date_Set( &p_sys->end_date, 0 );
block_Release( p_block );
return NULL;
}
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
if (p_block)
{
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
{
date_Set( &p_sys->end_date, 0 );
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
p_sys->i_state = STATE_NOSYNC;
block_BytestreamEmpty( &p_sys->bytestream );
block_Release( p_block );
*pp_block = NULL;
return NULL;
}
p_sys->b_discontinuity = true;
}

5
modules/codec/mpg123.c

@ -93,10 +93,11 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
goto error;
}
if( p_block->i_flags & ( BLOCK_FLAG_CORRUPTED ) )
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED) )
{
date_Set( &p_sys->end_date, 0 );
goto error;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
goto error;
}
/* Feed mpg123 with raw data */

4
modules/codec/omxil/omxil.c

@ -1534,7 +1534,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
return 0;
}
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
if(!p_sys->in.b_flushed)
@ -1652,7 +1652,7 @@ block_t *DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
return 0;
}
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
date_Set( &p_sys->end_date, 0 );

22
modules/codec/opus.c

@ -367,9 +367,22 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket,
{
decoder_sys_t *p_sys = p_dec->p_sys;
block_t *p_block = *pp_block;
*pp_block = NULL; /* To avoid being fed the same packet again */
if( !p_block )
return NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
return NULL;
}
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->end_date, 0 );
/* Date management */
if( p_block && p_block->i_pts > VLC_TS_INVALID &&
if( p_block->i_pts > VLC_TS_INVALID &&
p_block->i_pts != date_Get( &p_sys->end_date ) )
{
date_Set( &p_sys->end_date, p_block->i_pts );
@ -378,15 +391,10 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket,
if( !date_Get( &p_sys->end_date ) )
{
/* We've just started the stream, wait for the first PTS. */
if( p_block ) block_Release( p_block );
block_Release( p_block );
return NULL;
}
*pp_block = NULL; /* To avoid being fed the same packet again */
if( !p_block )
return NULL;
block_t *p_aout_buffer = DecodePacket( p_dec, p_oggpacket,
p_block->i_nb_samples,
(int)p_block->i_length );

3
modules/codec/rawvideo.c

@ -143,6 +143,9 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
block_t *p_block = *pp_block;
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->pts, p_block->i_dts );
if( p_block->i_pts <= VLC_TS_INVALID && p_block->i_dts <= VLC_TS_INVALID &&
!date_Get( &p_sys->pts ) )
{

2
modules/codec/schroedinger.c

@ -760,7 +760,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
/* reset the decoder when seeking as the decode in progress is invalid */
/* discard the block as it is just a null magic block */
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY ) {
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED) ) {
schro_decoder_reset( p_sys->p_schro );
p_sys->i_lastpts = VLC_TS_INVALID;

3
modules/codec/speex.c

@ -534,6 +534,9 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket,
decoder_sys_t *p_sys = p_dec->p_sys;
block_t *p_block = *pp_block;
if( p_block && p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->end_date, 0 );
/* Date management */
if( p_block && p_block->i_pts > VLC_TS_INVALID &&
p_block->i_pts != date_Get( &p_sys->end_date ) )

6
modules/codec/spudec/spudec.c

@ -207,6 +207,12 @@ static block_t *Reassemble( decoder_t *p_dec, block_t **pp_block )
p_block = *pp_block;
*pp_block = NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
return NULL;
}
if( p_sys->i_spu_size <= 0 &&
( p_block->i_pts <= VLC_TS_INVALID || p_block->i_buffer < 4 ) )
{

3
modules/codec/stl.c

@ -112,7 +112,8 @@ static subpicture_t *Decode(decoder_t *dec, block_t **block)
subpicture_t *sub = NULL;
block_t *b = *block; *block = NULL;
block_t *b = *block;
*block = NULL;
if (b->i_flags & (BLOCK_FLAG_CORRUPTED))
goto exit;
if (b->i_buffer < 128)

9
modules/codec/subsdec.c

@ -329,7 +329,9 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
return NULL;
p_block = *pp_block;
if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
*pp_block = NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
{
block_Release( p_block );
return NULL;
@ -338,8 +340,6 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
p_spu = ParseText( p_dec, p_block );
block_Release( p_block );
*pp_block = NULL;
return p_spu;
}
@ -366,6 +366,9 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
subpicture_t *p_spu = NULL;
char *psz_subtitle = NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
return NULL;
/* We cannot display a subpicture with no date */
if( p_block->i_pts <= VLC_TS_INVALID )
{

3
modules/codec/substtml.c

@ -497,6 +497,9 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
subpicture_t *p_spu = NULL;
char *psz_subtitle = NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
return NULL;
/* We cannot display a subpicture with no date */
if( p_block->i_pts <= VLC_TS_INVALID )
{

3
modules/codec/subsusf.c

@ -223,6 +223,9 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
subpicture_t *p_spu = NULL;
char *psz_subtitle = NULL;
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
return NULL;
/* We cannot display a subpicture with no date */
if( p_block->i_pts <= VLC_TS_INVALID )
{

14
modules/codec/theora.c

@ -424,9 +424,17 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket,
block_t *p_block = *pp_block;
void *p_buf;
if( ( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) != 0 )
*pp_block = NULL; /* To avoid being fed the same packet again */
if( !p_block )
return NULL;
if( ( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY ) != 0 )
p_sys->i_pts = p_block->i_pts;
if( ( p_block->i_flags & BLOCK_FLAG_CORRUPTED ) != 0 )
{
/* Don't send the the first packet after a discontinuity to
/* Don't send the a corrupted packet to
* theora_decode, otherwise we get purple/green display artifacts
* appearing in the video output */
block_Release(p_block);
@ -439,8 +447,6 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket,
p_sys->i_pts = p_block->i_pts;
}
*pp_block = NULL; /* To avoid being fed the same packet again */
if( p_sys->b_packetizer )
{
/* Date management */

12
modules/codec/uleaddvaudio.c

@ -62,13 +62,13 @@ static block_t *Decode(decoder_t *dec, block_t **block_ptr)
return NULL;
block_t *block = *block_ptr;
if (block->i_flags & BLOCK_FLAG_CORRUPTED) {
date_Set(&sys->end_date, 0);
block_Release(block);
return NULL;
}
if (block->i_flags & BLOCK_FLAG_DISCONTINUITY) {
if (block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
date_Set(&sys->end_date, 0);
if (block->i_flags & BLOCK_FLAG_CORRUPTED) {
block_Release(block);
*block_ptr = NULL;
return NULL;
}
}
if (block->i_pts > VLC_TS_INVALID &&

16
modules/codec/vorbis.c

@ -434,8 +434,21 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket,
decoder_sys_t *p_sys = p_dec->p_sys;
block_t *p_block = *pp_block;
*pp_block = NULL; /* To avoid being fed the same packet again */
if( !p_block )
return NULL;
if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
date_Set( &p_sys->end_date, 0 );
if( ( p_block->i_flags & BLOCK_FLAG_CORRUPTED ) != 0 )
{
block_Release(p_block);
return NULL;
}
/* Date management */
if( p_block && p_block->i_pts > VLC_TS_INVALID &&
if( p_block->i_pts > VLC_TS_INVALID &&
p_block->i_pts != date_Get( &p_sys->end_date ) )
{
date_Set( &p_sys->end_date, p_block->i_pts );
@ -448,7 +461,6 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket,
return NULL;
}
*pp_block = NULL; /* To avoid being fed the same packet again */
if( p_sys->b_packetizer )
{

13
modules/codec/wmafixed/wma.c

@ -201,12 +201,15 @@ static block_t *DecodeFrame( decoder_t *p_dec, block_t **pp_block )
p_block = *pp_block;
if( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
{
date_Set( &p_sys->end_date, 0 );
block_Release( p_block );
*pp_block = NULL;
return NULL;
date_Set( &p_sys->end_date, VLC_TS_INVALID );
if( p_block->i_flags & BLOCK_FLAG_CORRUPTED)
{
block_Release( p_block );
*pp_block = NULL;
return NULL;
}
}
if( p_block->i_buffer <= 0 )

Loading…
Cancel
Save