d�but de la synchro. �a n'influe pas sur le reste pour le moment, mais

la base des algos � deux balles est l�.
This commit is contained in:
Sam Hocevar 2000-01-18 22:33:16 +00:00
parent dd4339a97d
commit ba2a0abbc3
3 changed files with 123 additions and 3 deletions

View File

@ -16,10 +16,30 @@
*****************************************************************************/
/*****************************************************************************
* video_synchro_t : timers for the video synchro
* video_synchro_t and video_synchro_tab_s : timers for the video synchro
*****************************************************************************/
typedef struct video_synchro_tab_s
{
double mean;
double deviation;
int count;
} video_synchro_tab_t;
typedef struct video_synchro_s
{
int modulo;
/* P images since the last I */
int current_p_count;
double p_count_predict;
/* B images since the last I */
int current_b_count;
double b_count_predict;
/* 1 for linear count, 2 for binary count, 3 for ternary count */
video_synchro_tab_t tab_p[6];
video_synchro_tab_t tab_b[6];
} video_synchro_t;

View File

@ -995,6 +995,7 @@ static __inline__ void input_DemuxPES( input_thread_t *p_input,
break;
case AC3_AUDIO_ES:
/* we skip 4 bytes at the beginning of the AC3 payload */
p_ts->i_payload_start += 4;
p_fifo = &(((ac3dec_thread_t *)(p_es_descriptor->p_dec))->fifo);
break;

View File

@ -39,10 +39,108 @@
#include "vpar_synchro.h"
#include "video_parser.h"
#define MAX_COUNT 3
/*
* Local prototypes
*/
/*****************************************************************************
* vpar_SynchroUpdateTab : Update a mean table in the synchro structure
*****************************************************************************/
double vpar_SynchroUpdateTab( video_synchro_tab_t * tab, int count )
{
if( tab->count < MAX_COUNT)
tab->count++;
tab->mean = ( (tab->count-1) * tab->mean + count )
/ tab->count;
tab->deviation = ( (tab->count-1) * tab->deviation
+ abs (tab->mean - count) ) / tab->count;
}
/*****************************************************************************
* vpar_SynchroUpdateStructures : Update the synchro structures
*****************************************************************************/
void vpar_SynchroUpdateStructures( video_synchro_tab_t * tab,
int i_coding_type )
{
double candidate_deviation;
double optimal_deviation;
double predict;
switch(i_coding_type)
{
case P_CODING_TYPE:
p_vpar->synchro.current_p_count++;
break;
case B_CODING_TYPE:
p_vpar->synchro.current_b_count++;
break;
case I_CODING_TYPE:
/* update all the structures for P images */
optimal_deviation = vpar_SynchroUpdateTab(
&p_vpar->synchro.tab_p[0],
p_vpar->synchro.current_p_count);
predict = p_vpar->synchro.tab_p[0].mean;
candidate_deviation = vpar_SynchroUpdateTab(
&p_vpar->synchro.tab_p[1 + (modulo & 0x1)],
p_vpar->synchro.current_p_count);
if (candidate_deviation < optimal_deviation)
{
optimal_deviation = candidate_deviation;
predict = p_vpar->synchro.tab_p[1 + (modulo & 0x1)].mean;
}
candidate_deviation = vpar_SynchroUpdateTab(
&p_vpar->synchro.tab_p[3 + (modulo % 3)],
p_vpar->synchro.current_p_count);
if (candidate_deviation < optimal_deviation)
{
optimal_deviation = candidate_deviation;
predict = p_vpar->synchro.tab_p[1 + (modulo & 0x1)].mean;
}
p_vpar->synchro.p_count_predict = predict;
/* update all the structures for B images */
optimal_deviation = vpar_SynchroUpdateTab(
&p_vpar->synchro.tab_b[0],
p_vpar->synchro.current_b_count);
predict = p_vpar->synchro.tab_b[0].mean;
candidate_deviation = vpar_SynchroUpdateTab(
&p_vpar->synchro.tab_b[1 + (modulo & 0x1)],
p_vpar->synchro.current_b_count);
if (candidate_deviation < optimal_deviation)
{
optimal_deviation = candidate_deviation;
predict = p_vpar->synchro.tab_b[1 + (modulo & 0x1)].mean;
}
candidate_deviation = vpar_SynchroUpdateTab(
&p_vpar->synchro.tab_b[3 + (modulo % 3)],
p_vpar->synchro.current_b_count);
if (candidate_deviation < optimal_deviation)
{
optimal_deviation = candidate_deviation;
predict = p_vpar->synchro.tab_b[1 + (modulo & 0x1)].mean;
}
p_vpar->synchro.b_count_predict = predict;
break;
}
p_vpar->synchro.modulo++;
}
/*****************************************************************************
* vpar_SynchroChoose : Decide whether we will decode a picture or not
*****************************************************************************/
@ -60,6 +158,7 @@ boolean_t vpar_SynchroChoose( vpar_thread_t * p_vpar, int i_coding_type,
void vpar_SynchroTrash( vpar_thread_t * p_vpar, int i_coding_type,
int i_structure )
{
vpar_SynchroUpdateStructures (p_vpar, i_coding_type, i_structure);
}
@ -69,6 +168,8 @@ void vpar_SynchroTrash( vpar_thread_t * p_vpar, int i_coding_type,
mtime_t vpar_SynchroDecode( vpar_thread_t * p_vpar, int i_coding_type,
int i_structure )
{
vpar_SynchroUpdateStructures (p_vpar, i_coding_type, i_structure);
return mdate() + 3000000;
}
@ -80,5 +181,3 @@ void vpar_SynchroEnd( vpar_thread_t * p_vpar )
}