Commit d17615d4 authored by Sam Hocevar's avatar Sam Hocevar

. fix� une b�vue dans la YUV 8 bits

 . descendu le d�lai de d�marrage � .5 secondes au lieu de 2
 . un nouvelle synchro qui devrait punixe !!!
parent 57e189eb
...@@ -233,7 +233,7 @@ ...@@ -233,7 +233,7 @@
/* Duration between the time we receive the TS packet, and the time we will /* Duration between the time we receive the TS packet, and the time we will
* mark it to be presented */ * mark it to be presented */
#define INPUT_PTS_DELAY (2*CLOCK_FREQ) #define INPUT_PTS_DELAY (.5*CLOCK_FREQ)
#define INPUT_DVD_AUDIO_VAR "vlc_dvd_audio" #define INPUT_DVD_AUDIO_VAR "vlc_dvd_audio"
#define INPUT_DVD_CHANNEL_VAR "vlc_dvd_channel" #define INPUT_DVD_CHANNEL_VAR "vlc_dvd_channel"
...@@ -282,8 +282,8 @@ ...@@ -282,8 +282,8 @@
* standard width and height broadcasted MPEG-2 streams or DVDs */ * standard width and height broadcasted MPEG-2 streams or DVDs */
#define VOUT_WIDTH_VAR "vlc_width" #define VOUT_WIDTH_VAR "vlc_width"
#define VOUT_HEIGHT_VAR "vlc_height" #define VOUT_HEIGHT_VAR "vlc_height"
#define VOUT_WIDTH_DEFAULT 360 #define VOUT_WIDTH_DEFAULT 400
#define VOUT_HEIGHT_DEFAULT 288 #define VOUT_HEIGHT_DEFAULT 300
/* Maximum width of a scaled source picture - this should be relatively high, /* Maximum width of a scaled source picture - this should be relatively high,
* since higher stream values will result in no display at all. */ * since higher stream values will result in no display at all. */
......
...@@ -134,7 +134,6 @@ void ConvertYUV420RGB8( YUV_ARGS_8BPP ) ...@@ -134,7 +134,6 @@ void ConvertYUV420RGB8( YUV_ARGS_8BPP )
int dither22[4] = { 0x6, 0x16, 0x2, 0x12 }; int dither22[4] = { 0x6, 0x16, 0x2, 0x12 };
int dither23[4] = { 0x1e, 0xe, 0x1a, 0xa }; int dither23[4] = { 0x1e, 0xe, 0x1a, 0xa };
return;
/* /*
* Initialize some values - i_pic_line_width will store the line skip * Initialize some values - i_pic_line_width will store the line skip
*/ */
......
...@@ -167,7 +167,7 @@ ...@@ -167,7 +167,7 @@
p_y -= i_width; \ p_y -= i_width; \
p_u -= i_chroma_width; \ p_u -= i_chroma_width; \
p_v -= i_chroma_width; \ p_v -= i_chroma_width; \
p_pic += i_pic_line_width; \ p_pic += i_pic_line_width; \
} \ } \
i_scale_count += i_pic_height; \ i_scale_count += i_pic_height; \
break; \ break; \
......
...@@ -219,7 +219,7 @@ static void RunThread (ac3dec_thread_t * p_ac3dec) ...@@ -219,7 +219,7 @@ static void RunThread (ac3dec_thread_t * p_ac3dec)
int ptr; int ptr;
ac3_byte_stream_t * p_byte_stream; ac3_byte_stream_t * p_byte_stream;
intf_Msg ("ac3dec: sync\n"); intf_DbgMsg ("ac3dec: sync\n");
p_byte_stream = ac3_byte_stream (&p_ac3dec->ac3_decoder); p_byte_stream = ac3_byte_stream (&p_ac3dec->ac3_decoder);
......
...@@ -238,7 +238,7 @@ static void RunThread (adec_thread_t * p_adec) ...@@ -238,7 +238,7 @@ static void RunThread (adec_thread_t * p_adec)
/* have to find a synchro point */ /* have to find a synchro point */
adec_byte_stream_t * p_byte_stream; adec_byte_stream_t * p_byte_stream;
intf_Msg ( "adec: sync\n" ); intf_DbgMsg ( "adec: sync\n" );
p_adec->align = 0; p_adec->align = 0;
p_byte_stream = adec_byte_stream ( &p_adec->audio_decoder ); p_byte_stream = adec_byte_stream ( &p_adec->audio_decoder );
......
...@@ -943,7 +943,7 @@ static __inline__ void input_DemuxPES( input_thread_t *p_input, ...@@ -943,7 +943,7 @@ static __inline__ void input_DemuxPES( input_thread_t *p_input,
intf_DbgMsg("PES packet too short: trashed\n"); intf_DbgMsg("PES packet too short: trashed\n");
input_NetlistFreePES( p_input, p_pes ); input_NetlistFreePES( p_input, p_pes );
p_pes = NULL; p_pes = NULL;
/* Stats XXX?? */ /* XXX: Stats */
return; return;
} }
...@@ -1106,7 +1106,7 @@ static __inline__ void input_ParsePES( input_thread_t *p_input, ...@@ -1106,7 +1106,7 @@ static __inline__ void input_ParsePES( input_thread_t *p_input,
{ {
/* Trash the packet and set p_pes to NULL to be sure the next PES /* Trash the packet and set p_pes to NULL to be sure the next PES
packet will have its b_data_lost flag set */ packet will have its b_data_lost flag set */
intf_DbgMsg("Corrupted PES packet received: trashed\n"); intf_DbgMsg("Corrupted PES packet (size doesn't match) : trashed\n");
input_NetlistFreePES( p_input, p_pes ); input_NetlistFreePES( p_input, p_pes );
p_pes = NULL; p_pes = NULL;
/* Stats XXX?? */ /* Stats XXX?? */
...@@ -1133,58 +1133,72 @@ static __inline__ void input_ParsePES( input_thread_t *p_input, ...@@ -1133,58 +1133,72 @@ static __inline__ void input_ParsePES( input_thread_t *p_input,
break; break;
default: default:
/* The PES header contains at least 3 more bytes: parse them */ switch( p_pes->p_pes_header[8] & 0xc0 )
p_pes->b_data_alignment = p_pes->p_pes_header[6] & 0x04;
p_pes->b_has_pts = p_pes->p_pes_header[7] & 0x80;
i_pes_header_size = p_pes->p_pes_header[8] + 9;
/* Now parse the optional header extensions (in the limit of
the 14 bytes */
if( p_pes->b_has_pts )
{ {
pcr_descriptor_t * p_pcr; case 0x80: /* MPEG2: 10xx xxxx */
case 0x00: /* FIXME: This shouldn't be allowed !! */
/* The PES header contains at least 3 more bytes: parse them */
p_pes->b_data_alignment = p_pes->p_pes_header[6] & 0x04;
p_pes->b_has_pts = p_pes->p_pes_header[7] & 0x80;
i_pes_header_size = p_pes->p_pes_header[8] + 9;
/* Now parse the optional header extensions (in the limit of
the 14 bytes */
if( p_pes->b_has_pts )
{
pcr_descriptor_t * p_pcr;
p_pcr = p_input->p_pcr; p_pcr = p_input->p_pcr;
p_pes->i_pts = p_pes->i_pts =
( ((mtime_t)(p_pes->p_pes_header[9] & 0x0E) << 29) | ( ((mtime_t)(p_pes->p_pes_header[9] & 0x0E) << 29) |
(((mtime_t)U16_AT(p_pes->p_pes_header + 10) << 14) - (1 << 14)) | (((mtime_t)U16_AT(p_pes->p_pes_header + 10) << 14) - (1 << 14)) |
((mtime_t)U16_AT(p_pes->p_pes_header + 12) >> 1) ) * 300; ((mtime_t)U16_AT(p_pes->p_pes_header + 12) >> 1) ) * 300;
p_pes->i_pts /= 27; p_pes->i_pts /= 27;
if( p_pcr->i_synchro_state ) if( p_pcr->i_synchro_state )
{
switch( p_pcr->i_synchro_state )
{ {
case SYNCHRO_NOT_STARTED: switch( p_pcr->i_synchro_state )
p_pes->b_has_pts = 0; {
break; case SYNCHRO_NOT_STARTED:
p_pes->b_has_pts = 0;
case SYNCHRO_START: break;
p_pes->i_pts += p_pcr->delta_pcr;
p_pcr->delta_absolute = mdate() - p_pes->i_pts + INPUT_PTS_DELAY; case SYNCHRO_START:
p_pes->i_pts += p_pcr->delta_absolute; p_pes->i_pts += p_pcr->delta_pcr;
p_pcr->i_synchro_state = 0; p_pcr->delta_absolute = mdate() - p_pes->i_pts + INPUT_PTS_DELAY;
break; p_pes->i_pts += p_pcr->delta_absolute;
p_pcr->i_synchro_state = 0;
case SYNCHRO_REINIT: /* We skip a PES */ break;
p_pes->b_has_pts = 0;
p_pcr->i_synchro_state = SYNCHRO_START; case SYNCHRO_REINIT: /* We skip a PES */
break; p_pes->b_has_pts = 0;
p_pcr->i_synchro_state = SYNCHRO_START;
break;
}
}
else
{
p_pes->i_pts += p_pcr->delta_pcr + p_pcr->delta_absolute;
} }
} }
else break;
{
p_pes->i_pts += p_pcr->delta_pcr + p_pcr->delta_absolute; default: /* MPEG1 or some strange thing */
} /* since this isn't supported yet, we certainly gonna crash */
intf_ErrMsg( "FIXME: unknown PES type %.2x\n",
p_pes->p_pes_header[8] );
i_pes_header_size = 6;
break;
} }
break; break;
} }
/* Now we've parsed the header, we just have to indicate in some /* Now we've parsed the header, we just have to indicate in some
specific TS packets where the PES payload begins (renumber * specific TS packets where the PES payload begins (renumber
i_payload_start), so that the decoders can find the beginning * i_payload_start), so that the decoders can find the beginning
of their data right out of the box. */ * of their data right out of the box. */
p_ts = p_pes->p_first_ts; p_ts = p_pes->p_first_ts;
i_ts_payload_size = p_ts->i_payload_end - p_ts->i_payload_start; i_ts_payload_size = p_ts->i_payload_end - p_ts->i_payload_start;
while( i_pes_header_size > i_ts_payload_size ) while( i_pes_header_size > i_ts_payload_size )
...@@ -1193,8 +1207,8 @@ static __inline__ void input_ParsePES( input_thread_t *p_input, ...@@ -1193,8 +1207,8 @@ static __inline__ void input_ParsePES( input_thread_t *p_input,
i_pes_header_size -= i_ts_payload_size; i_pes_header_size -= i_ts_payload_size;
p_ts->i_payload_start = p_ts->i_payload_end; p_ts->i_payload_start = p_ts->i_payload_end;
/* Go to the next TS packet: here we won't have to test it is /* Go to the next TS packet: here we won't have to test it is
not NULL because we trash the PES packets when packet lost * not NULL because we trash the PES packets when packet lost
occurs */ * occurs */
p_ts = p_ts->p_next_ts; p_ts = p_ts->p_next_ts;
i_ts_payload_size = p_ts->i_payload_end - p_ts->i_payload_start; i_ts_payload_size = p_ts->i_payload_end - p_ts->i_payload_start;
} }
...@@ -1203,7 +1217,7 @@ static __inline__ void input_ParsePES( input_thread_t *p_input, ...@@ -1203,7 +1217,7 @@ static __inline__ void input_ParsePES( input_thread_t *p_input,
/* Now we can eventually put the PES packet in the decoder's /* Now we can eventually put the PES packet in the decoder's
PES fifo */ * PES fifo */
switch( p_es_descriptor->i_type ) switch( p_es_descriptor->i_type )
{ {
case MPEG1_VIDEO_ES: case MPEG1_VIDEO_ES:
...@@ -1308,9 +1322,9 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input, ...@@ -1308,9 +1322,9 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input,
/* Try to find the beginning of the payload in the packet to initialise /* Try to find the beginning of the payload in the packet to initialise
the do-while loop that follows -> Compute the i_data_offset variable: * the do-while loop that follows -> Compute the i_data_offset variable:
by default, the value is set so that we won't enter in the while loop. * by default, the value is set so that we won't enter in the while loop.
It will be set to a correct value if the data are not corrupted */ * It will be set to a correct value if the data are not corrupted */
i_data_offset = TS_PACKET_SIZE; i_data_offset = TS_PACKET_SIZE;
/* Has the reassembly of a section already begun in a previous packet ? */ /* Has the reassembly of a section already begun in a previous packet ? */
...@@ -1328,7 +1342,7 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input, ...@@ -1328,7 +1342,7 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input,
else else
{ {
/* The data that complete a previously began section are always at /* The data that complete a previously began section are always at
the beginning of the TS payload... */ * the beginning of the TS payload... */
i_data_offset = p_ts_packet->i_payload_start; i_data_offset = p_ts_packet->i_payload_start;
/* ...Unless there is a pointer field, that we have to bypass */ /* ...Unless there is a pointer field, that we have to bypass */
if( b_unit_start ) if( b_unit_start )
...@@ -1342,9 +1356,9 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input, ...@@ -1342,9 +1356,9 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input,
if( b_unit_start ) if( b_unit_start )
{ {
/* Get the offset at which the data for that section can be found /* Get the offset at which the data for that section can be found
The offset is stored in the pointer_field since we are * The offset is stored in the pointer_field since we are
interested in the first section of the TS packet. Note that * interested in the first section of the TS packet. Note that
the +1 is to bypass the pointer field */ * the +1 is to bypass the pointer field */
i_data_offset = p_ts_packet->i_payload_start + i_data_offset = p_ts_packet->i_payload_start +
p_ts_packet->buffer[p_ts_packet->i_payload_start] + 1; p_ts_packet->buffer[p_ts_packet->i_payload_start] + 1;
//intf_DbgMsg( "New section beginning at offset %d in TS packet\n", i_data_offset ); //intf_DbgMsg( "New section beginning at offset %d in TS packet\n", i_data_offset );
...@@ -1401,7 +1415,7 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input, ...@@ -1401,7 +1415,7 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input,
i_data_length ); i_data_length );
/* Interesting data are now after the ones we copied, since no gap is /* Interesting data are now after the ones we copied, since no gap is
allowed between 2 sections in a TS packets */ * allowed between 2 sections in a TS packets */
i_data_offset += i_data_length; i_data_offset += i_data_length;
/* Decode the packet if it is now complete */ /* Decode the packet if it is now complete */
...@@ -1434,3 +1448,4 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input, ...@@ -1434,3 +1448,4 @@ static __inline__ void input_DemuxPSI( input_thread_t *p_input,
#undef p_psi #undef p_psi
} }
...@@ -65,9 +65,9 @@ ...@@ -65,9 +65,9 @@
void vpar_SynchroUpdateStructures( vpar_thread_t * p_vpar, void vpar_SynchroUpdateStructures( vpar_thread_t * p_vpar,
int i_coding_type, boolean_t b_kept ) int i_coding_type, boolean_t b_kept )
{ {
mtime_t i_delay; double i_can_display;
mtime_t i_pts; mtime_t i_pts;
pes_packet_t * p_pes = p_vpar->bit_stream.p_decoder_fifo->buffer[ pes_packet_t * p_pes = p_vpar->bit_stream.p_decoder_fifo->buffer[
p_vpar->bit_stream.p_decoder_fifo->i_start ]; p_vpar->bit_stream.p_decoder_fifo->i_start ];
/* try to guess the current DTS and PTS */ /* try to guess the current DTS and PTS */
...@@ -126,58 +126,52 @@ void vpar_SynchroUpdateStructures( vpar_thread_t * p_vpar, ...@@ -126,58 +126,52 @@ void vpar_SynchroUpdateStructures( vpar_thread_t * p_vpar,
} }
/* now we calculated all statistics, it's time to /* now we calculated all statistics, it's time to
* decide what we have the time to display * decide what we have the time to display */
*/ i_can_display = (float)(i_pts - p_vpar->synchro.i_last_kept_I_pts)
i_delay = i_pts - p_vpar->synchro.i_last_kept_I_pts; / p_vpar->synchro.i_delay;
p_vpar->synchro.b_all_I p_vpar->synchro.b_all_I = 0;
= ( p_vpar->synchro.i_delay < i_delay ); p_vpar->synchro.b_all_B = 0;
p_vpar->synchro.b_all_P = 0;
p_vpar->synchro.displayable_p = 0;
p_vpar->synchro.displayable_b = 0;
p_vpar->synchro.b_all_P if( ( p_vpar->synchro.b_all_I = ( i_can_display > 1 ) ) )
= ( p_vpar->synchro.i_delay
* (1 + p_vpar->synchro.i_P_seen) < i_delay );
if( !p_vpar->synchro.b_all_P )
{
p_vpar->synchro.displayable_p
//= -1.0 + (float)i_delay / (float)p_vpar->synchro.i_delay;
= (-1.0 + (float)p_vpar->synchro.displayable_p + (float)i_delay / (float)p_vpar->synchro.i_delay) / 2.0;
if( p_vpar->synchro.displayable_p < 0 )
p_vpar->synchro.displayable_p = 0;
p_vpar->synchro.b_all_B = 0;
p_vpar->synchro.displayable_b = 0;
}
else
{ {
p_vpar->synchro.displayable_p = p_vpar->synchro.i_P_seen; i_can_display -= 1;
if( !(p_vpar->synchro.b_all_B if( !( p_vpar->synchro.b_all_P
= ( p_vpar->synchro.i_delay = ( i_can_display > p_vpar->synchro.i_P_seen ) ) )
* (1 + p_vpar->synchro.i_B_seen
+ p_vpar->synchro.i_P_seen)) < i_delay) )
{ {
p_vpar->synchro.displayable_b p_vpar->synchro.displayable_p = i_can_display;
//= -2.0 + i_delay / p_vpar->synchro.i_delay - p_vpar->synchro.b_all_P;
= ( -2.0 + (float)p_vpar->synchro.displayable_b + (float)i_delay / (float)p_vpar->synchro.i_delay - (float)p_vpar->synchro.b_all_P) / 2.0;
} }
else else
{ {
p_vpar->synchro.displayable_b = p_vpar->synchro.i_B_seen; i_can_display -= p_vpar->synchro.i_P_seen;
if( !( p_vpar->synchro.b_all_B
= ( i_can_display > p_vpar->synchro.i_B_seen ) ) )
{
p_vpar->synchro.displayable_b = i_can_display;
}
} }
} }
#if 1 #if 1
if( p_vpar->synchro.b_all_I ) if( p_vpar->synchro.b_all_I )
intf_ErrMsg( "I: all " ); intf_ErrMsg( "I: 1/1 " );
if( p_vpar->synchro.b_all_P ) if( p_vpar->synchro.b_all_P )
intf_ErrMsg( "P: all " ); intf_ErrMsg( "P: %i/%i ", p_vpar->synchro.i_P_seen,
p_vpar->synchro.i_P_seen );
else if( p_vpar->synchro.displayable_p > 0 ) else if( p_vpar->synchro.displayable_p > 0 )
intf_ErrMsg( "P: %f ", p_vpar->synchro.displayable_p ); intf_ErrMsg( "P: %.2f/%i ", p_vpar->synchro.displayable_p,
p_vpar->synchro.i_P_seen );
if( p_vpar->synchro.b_all_B ) if( p_vpar->synchro.b_all_B )
intf_ErrMsg( "B: all" ); intf_ErrMsg( "B: %i/%i", p_vpar->synchro.displayable_b,
p_vpar->synchro.displayable_b );
else if( p_vpar->synchro.displayable_b > 0 ) else if( p_vpar->synchro.displayable_b > 0 )
intf_ErrMsg( "B: %f", p_vpar->synchro.displayable_b ); intf_ErrMsg( "B: %.2f/%i", p_vpar->synchro.displayable_b,
p_vpar->synchro.i_B_seen );
intf_ErrMsg( "\n" ); intf_ErrMsg( "\n" );
#endif #endif
p_vpar->synchro.i_P_seen = 0; p_vpar->synchro.i_P_seen = 0;
...@@ -212,6 +206,7 @@ boolean_t vpar_SynchroChoose( vpar_thread_t * p_vpar, int i_coding_type, ...@@ -212,6 +206,7 @@ boolean_t vpar_SynchroChoose( vpar_thread_t * p_vpar, int i_coding_type,
case P_CODING_TYPE: case P_CODING_TYPE:
//return(1);
if( p_vpar->synchro.b_all_P ) if( p_vpar->synchro.b_all_P )
{ {
//intf_ErrMsg( " p " ); //intf_ErrMsg( " p " );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment