Commit 5bbfc2b4 authored by Laurent Aimar's avatar Laurent Aimar

* plugins/ffmpeg/ffmpeg.c : with empty frame(data_packet) it won't segfault

    * plugins/avi/avi.c : use KeyFrame to seek, so video will not be bad as
        before
parent 5a70322c
......@@ -2,7 +2,7 @@
* avi.c : AVI file Stream input module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: avi.c,v 1.1 2002/04/23 23:44:36 fenrir Exp $
* $Id: avi.c,v 1.2 2002/04/25 03:01:03 fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
......@@ -105,7 +105,6 @@ static void __AVIFreeDemuxData( input_thread_t *p_input )
RIFF_DeleteChunk( p_input->p_demux_data, p_avi_demux->p_movi );
if( p_avi_demux->p_idx1 != NULL )
RIFF_DeleteChunk( p_input->p_demux_data, p_avi_demux->p_idx1 );
return;
if( p_avi_demux->pp_info != NULL )
{
for( i = 0; i < p_avi_demux->i_streams; i++ )
......@@ -113,16 +112,29 @@ static void __AVIFreeDemuxData( input_thread_t *p_input )
if( p_avi_demux->pp_info[i] != NULL )
{
#define p_info p_avi_demux->pp_info[i]
/* don't uses RIFF_DeleteChunk -> it will segfault here ( probably because of
data_packey already unallocated ? */
if( p_info->p_strl != NULL )
RIFF_DeleteChunk( p_input->p_demux_data, p_info->p_strl );
if( p_info->p_strh != NULL )
RIFF_DeleteChunk( p_input->p_demux_data,p_info->p_strh );
{
free( p_info->p_strl );
}
if( p_info->p_strh != NULL )
{
free( p_info->p_strh );
}
if( p_info->p_strf != NULL )
RIFF_DeleteChunk( p_input->p_demux_data,p_info->p_strf );
if( p_info->p_strd != NULL )
RIFF_DeleteChunk( p_input->p_demux_data,p_info->p_strd );
{
free( p_info->p_strf );
}
if( p_info->p_strd != NULL )
{
free( p_info->p_strd );
}
if( p_info->p_index != NULL )
free( p_info->p_index );
{
free( p_info->p_index );
}
free( p_info );
#undef p_info
}
......@@ -198,7 +210,6 @@ int avi_ParseWaveFormatEx( waveformatex_t *h, byte_t *p_data )
static int __AVI_ParseStreamHeader( u32 i_id, int *i_number, u16 *i_type )
{
int c1,c2,c3,c4;
char str[3];
c1 = ( i_id ) & 0xFF;
c2 = ( i_id >> 8 ) & 0xFF;
......@@ -209,10 +220,7 @@ static int __AVI_ParseStreamHeader( u32 i_id, int *i_number, u16 *i_type )
{
return( -1 );
}
str[0] = c1;
str[1] = c2;
str[2] = 0;
*i_number = atoi( str );
*i_number = (c1 - '0') * 10 + (c2 - '0' );
*i_type = ( c3 << 8) + c4;
return( 0 );
}
......@@ -306,7 +314,7 @@ static void __AVI_GetIndex( input_thread_t *p_input )
return;
}
i_read /= 16 ;
/* try to verify if we are beyond end of p_idx1 */
/* TODO try to verify if we are beyond end of p_idx1 */
for( i = 0; i < i_read; i++ )
{
byte_t *p_peek = p_buff + i * 16;
......@@ -445,7 +453,7 @@ static int AVIInit( input_thread_t *p_input )
es_descriptor_t *p_es_video = NULL;
es_descriptor_t *p_es_audio = NULL;
int i,j;
int i;
p_avi_demux = malloc( sizeof(demux_data_avi_file_t) );
memset( p_avi_demux, 0, sizeof( demux_data_avi_file_t ) );
......@@ -636,7 +644,6 @@ static int AVIInit( input_thread_t *p_input )
p_input->stream.p_selected_program = p_input->stream.pp_programs[0];
p_input->stream.p_new_program = p_input->stream.pp_programs[0] ;
/* FIXME FIXME id des es doit etre unique FIXME FIXME */
vlc_mutex_lock( &p_input->stream.stream_lock );
for( i = 0; i < p_avi_demux->i_streams; i++ )
{
......@@ -646,17 +653,17 @@ static int AVIInit( input_thread_t *p_input )
switch( p_info->header.i_type )
{
case( FOURCC_auds ):
/* pour l'id j'ai mis 12 pr audio et 42 pour video */
/* pour l'id j'ai mis 12+i pr audio et 42+i pour video */
/* et le numero du flux(ici i) dans i_stream_id */
avi_ParseWaveFormatEx( &p_info->audio_format,
avi_ParseWaveFormatEx( &p_info->audio_format,
p_info->p_strf->p_data->p_payload_start );
p_es = input_AddES( p_input,
p_es = input_AddES( p_input,
p_input->stream.p_selected_program, 12+i,
p_info->p_strf->i_size );
p_es->i_cat = AUDIO_ES;
p_es->b_audio = 1;
p_es->i_type =
__AVI_AudioGetType( p_info->audio_format.i_formattag );
p_es->i_stream_id =i; /* FIXME */
if( p_es->i_type == 0 )
{
intf_ErrMsg( "input error: stream(%d,0x%x) not supported",
......@@ -666,9 +673,9 @@ static int AVIInit( input_thread_t *p_input )
}
else
{
if( p_es_audio == NULL ) p_es_audio = p_es;
if( p_es_audio == NULL ) {p_es_audio = p_es;}
p_es->i_cat = AUDIO_ES;
}
p_es->i_stream_id =i; /* FIXME */
break;
case( FOURCC_vids ):
......@@ -678,21 +685,22 @@ static int AVIInit( input_thread_t *p_input )
p_es = input_AddES( p_input,
p_input->stream.p_selected_program, 42+i,
p_info->p_strf->i_size );
p_es->i_cat = VIDEO_ES;
p_es->b_audio = 0;
p_es->i_type =
__AVI_VideoGetType( p_info->video_format.i_compression );
p_es->i_stream_id =i; /* FIXME */
if( p_es->i_type == 0 )
{
intf_ErrMsg( "input error: stream(%d,%4.4s) not supported",
i,
(char*)&p_info->video_format.i_compression);
p_es->i_cat = UNKNOWN_ES;
}
else
{
if( p_es_video == NULL ) p_es_video = p_es;
if( p_es_video == NULL ) {p_es_video = p_es;}
p_es->i_cat = VIDEO_ES;
}
p_es->i_stream_id =i; /* FIXME */
break;
default:
p_es = input_AddES( p_input,
......@@ -706,12 +714,9 @@ static int AVIInit( input_thread_t *p_input )
p_info->p_es = p_es;
p_info->i_cat = p_es->i_cat;
/* We copy strf for decoder in p_es->p_demux_data */
for( j = 0; j < p_info->p_strf->i_size; j++ )
{
*((byte_t*)p_es->p_demux_data + j) =
*(p_info->p_strf->p_data->p_payload_start + j);
}
memcpy( p_es->p_demux_data,
p_info->p_strf->p_data->p_payload_start,
p_info->p_strf->i_size );
/* print informations on stream */
switch( p_es->i_cat )
{
......@@ -741,30 +746,30 @@ static int AVIInit( input_thread_t *p_input )
}
/* we select the first audio and video ES */
if( p_es_audio != NULL )
if( p_es_video != NULL )
{
input_SelectES( p_input, p_es_audio );
input_SelectES( p_input, p_es_video );
}
else
{
intf_Msg( "input init: no audio stream found !" );
intf_ErrMsg( "input error: no video stream found !" );
vlc_mutex_unlock( &p_input->stream.stream_lock );
return( -1 );
}
if( p_es_video != NULL )
if( p_es_audio != NULL )
{
input_SelectES( p_input, p_es_video );
input_SelectES( p_input, p_es_audio );
}
else
{
intf_ErrMsg( "input error: no video stream found !" );
return( -1 );
vlc_mutex_unlock( &p_input->stream.stream_lock );
}
/* p_input->stream.p_selected_area->i_tell = 0; */
intf_Msg( "input init: no audio stream found !" );
}
/* p_input->stream.p_selected_area->i_tell = 0; */
p_input->stream.i_mux_rate = p_avi_demux->avih.i_maxbytespersec / 50;
p_input->stream.p_selected_program->b_is_ok = 1;
vlc_mutex_unlock( &p_input->stream.stream_lock );
/* stoker les donnes p_demux_data dans p_input */
return( 0 );
}
......@@ -775,7 +780,7 @@ static void AVIEnd( input_thread_t *p_input )
}
static mtime_t __AVI_GetPTSAudio( AVIStreamInfo_t *p_info )
static mtime_t __AVI_GetPTS( AVIStreamInfo_t *p_info )
{
/* XXX you need to had p_info->i_date to have correct pts */
/* p_info->p_index[p_info->i_idxpos] need to be valid !! */
......@@ -787,7 +792,8 @@ static mtime_t __AVI_GetPTSAudio( AVIStreamInfo_t *p_info )
i_pts = (mtime_t)( (double)1000000.0 *
(double)p_info->p_index[p_info->i_idxpos].i_lengthtotal *
(double)p_info->header.i_scale /
(double)p_info->header.i_rate);
(double)p_info->header.i_rate /
(double)p_info->header.i_samplesize );
}
else
{
......@@ -799,33 +805,7 @@ static mtime_t __AVI_GetPTSAudio( AVIStreamInfo_t *p_info )
return( i_pts );
}
static mtime_t __AVI_GetPTSVideo( AVIStreamInfo_t *p_info )
{
/* XXX you need to had p_info->i_date to have correct pts */
mtime_t i_pts;
i_pts = (mtime_t)( (double)1000000.0 *
(double)p_info->i_idxpos *
(double)p_info->header.i_scale /
(double)p_info->header.i_rate);
return( i_pts );
}
static mtime_t __AVI_GetPTS( AVIStreamInfo_t *p_info )
{
switch( p_info->i_cat )
{
case( AUDIO_ES ):
return( __AVI_GetPTSAudio( p_info ) );
case( VIDEO_ES ):
return( __AVI_GetPTSVideo( p_info ) );
default:
return( mdate() + DEFAULT_PTS_DELAY );
}
}
static void __AVI_ControleUnPause()
{
}
static void __AVI_NextIndexEntry( input_thread_t *p_input,
AVIStreamInfo_t *p_info )
......@@ -835,74 +815,86 @@ static void __AVI_NextIndexEntry( input_thread_t *p_input,
{
/* we need to verify if we reach end of file
or if index is broken and search manually */
intf_WarnMsg( 1, "input demux: out of index" );
}
}
static void __AVI_ReInitDate( demux_data_avi_file_t *p_avi_demux )
{
mtime_t i_ptsmin = 0;
int i;
int b_first = 1;
for( i = 0; i < p_avi_demux->i_streams; i++ )
{
#define p_info p_avi_demux->pp_info[i]
if( (p_info->p_es->p_decoder_fifo != NULL)
&&( !p_info->b_unselected ) )
{
i_ptsmin = __MIN( i_ptsmin,
__AVI_GetPTS( p_info ) );
if( b_first )
{
i_ptsmin = __AVI_GetPTS( p_info );
b_first = 0;
}
}
#undef p_info
}
p_avi_demux->i_date = mdate() + DEFAULT_PTS_DELAY - i_ptsmin;
}
static int __AVI_ReAlign( input_thread_t *p_input,
AVIStreamInfo_t *p_info )
{
u32 i_pos;
int i_idxpos;
__RIFF_TellPos( p_input, &i_pos );
u32 u32_pos;
off_t i_pos;
__RIFF_TellPos( p_input, &u32_pos );
i_pos = (off_t)u32_pos - (off_t)p_info->i_idxoffset;
/* TODO verifier si on est dans p_movi */
if( p_info->p_index[p_info->i_idxnb-1].i_offset +
p_info->i_idxoffset < i_pos )
if( p_info->p_index[p_info->i_idxnb-1].i_offset <= i_pos )
{
return( -1 );
p_info->i_idxpos = p_info->i_idxnb-1;
return( 0 );
}
i_idxpos = p_info->i_idxpos;
i_pos -= p_info->i_idxoffset;
if( i_pos < 0 )
if( i_pos <= p_info->p_index[0].i_offset )
{
p_info->i_idxpos = 0;
return( 0 );
}
/* if we have seek in the current chunk then do nothing
__AVI_SeekToChunk will correct */
if( (p_info->p_index[p_info->i_idxpos].i_offset <= i_pos)
&& ( i_pos < p_info->p_index[p_info->i_idxpos].i_offset +
p_info->p_index[p_info->i_idxpos].i_length ) )
{
return( 0 );
}
while( p_info->p_index[i_idxpos].i_offset > i_pos )
if( i_pos >= p_info->p_index[p_info->i_idxpos].i_offset )
{
i_idxpos--;
if( i_idxpos <= 0 ) { return( -1 );}
/* search for a chunk after i_idxpos */
while( (p_info->p_index[p_info->i_idxpos].i_offset < i_pos)
&&( p_info->i_idxpos < p_info->i_idxnb - 1 ) )
{
p_info->i_idxpos++;
}
while( ((p_info->p_index[p_info->i_idxpos].i_flags&AVIIF_KEYFRAME) == 0)
&&( p_info->i_idxpos < p_info->i_idxnb - 1 ) )
{
p_info->i_idxpos++;
}
}
while( p_info->p_index[i_idxpos].i_offset +
p_info->p_index[i_idxpos].i_length < i_pos )
else
{
i_idxpos++;
if( i_idxpos >= p_info->i_idxnb ) { return( -1 );}
/* search for a chunk before i_idxpos */
while( (p_info->p_index[p_info->i_idxpos].i_offset +
p_info->p_index[p_info->i_idxpos].i_length >= i_pos)
&&( p_info->i_idxpos > 0 ) )
{
p_info->i_idxpos--;
}
while( ((p_info->p_index[p_info->i_idxpos].i_flags&AVIIF_KEYFRAME) == 0)
&( p_info->i_idxpos > 0 ) )
{
p_info->i_idxpos--;
}
}
p_info->i_idxpos = i_idxpos;
return( 0 );
}
static void __AVI_SynchroReInit( input_thread_t *p_input,
AVIStreamInfo_t *p_info_master,
AVIStreamInfo_t *p_info_slave )
{
demux_data_avi_file_t *p_avi_demux;
p_avi_demux = (demux_data_avi_file_t*)p_input->p_demux_data;
p_avi_demux->i_date = mdate() + DEFAULT_PTS_DELAY
- __AVI_GetPTS( p_info_master );
/* TODO: a optimiser */
p_info_slave->i_idxpos = 0;
p_info_slave->b_unselected = 1; /* to correct audio */
p_input->stream.p_selected_program->i_synchro_state = SYNCHRO_OK;
}
/** -1 in case of error, 0 of EOF, 1 otherwise **/
static int AVIDemux( input_thread_t *p_input )
{
......@@ -912,20 +904,6 @@ static int AVIDemux( input_thread_t *p_input )
* juste une succesion de 00dc 01wb ...
* pire tout audio puis tout video ou vice versa
*/
/*
From xine-lib :
static uint32_t get_audio_pts (demux_avi_t *this, long posc, long posb)
{
if (this->avi->dwSampleSize==0)
return posc * (double) this->avi->dwScale_audio / this->avi->dwRate_audio * 90000.0;
else
return (this->avi->audio_index[posc].tot+posb)/this->avi->dwSampleSize * (double) this->avi->dwScale_audio / this->avi->dwRate_audio * 90000.0;
}
static uint32_t get_video_pts (demux_avi_t *this, long pos)
{
return pos * (double) this->avi->dwScale / this->avi->dwRate * 90000.0;
}
*/
/* TODO : * a better method to realign
* verify that we are reading in p_movi
* XXX be sure to send audio before video to avoid click
......@@ -976,8 +954,7 @@ static uint32_t get_video_pts (demux_avi_t *this, long pos)
if( input_ClockManageControl( p_input, p_input->stream.p_selected_program,
(mtime_t)0) == PAUSE_S )
{
__AVI_ControleUnPause();
p_input->stream.p_selected_program->i_synchro_state = SYNCHRO_REINIT;
__AVI_SynchroReInit( p_input, p_info_video, p_info_audio );
}
/* after updated p_avi_demux->pp_info[i]->b_unselected !! */
......@@ -985,19 +962,12 @@ static uint32_t get_video_pts (demux_avi_t *this, long pos)
{
/* TODO check if we have seek */
__AVI_ReAlign( p_input, p_info_video ); /*on se realigne pr la video */
p_input->stream.p_selected_program->i_synchro_state = SYNCHRO_OK;
p_avi_demux->i_date = mdate() + DEFAULT_PTS_DELAY
- __AVI_GetPTSVideo( p_info_video );
/* TODO: a optimiser */
p_info_audio->i_idxpos = 0;
p_info_audio->b_unselected = 1; /* to correct audio */
p_input->stream.p_selected_program->i_synchro_state = SYNCHRO_OK;
__AVI_SynchroReInit( p_input, p_info_video, p_info_audio );
}
/* update i_date if previously unselected ES (ex: 2 channels audio ) */
if( (p_info_audio != NULL)&&(p_info_audio->b_unselected ))
{
intf_WarnMsg( 1, "input demux: reinit synchro for unselected es" );
/* we have to go to the good pts */
/* we will reach p_info_ok pts */
while( __AVI_GetPTS( p_info_audio) < __AVI_GetPTS( p_info_video) )
......@@ -1014,8 +984,8 @@ static uint32_t get_video_pts (demux_avi_t *this, long pos)
}
else
{
if( __AVI_GetPTSAudio( p_info_audio ) <=
__AVI_GetPTSVideo( p_info_video ) )
if( __AVI_GetPTS( p_info_audio ) <=
__AVI_GetPTS( p_info_video ) )
{
p_info = p_info_audio;
}
......@@ -1025,7 +995,7 @@ static uint32_t get_video_pts (demux_avi_t *this, long pos)
}
}
/* go the good chunk to read */
/* go to the good chunk to read */
__AVI_SeekToChunk( p_input, p_info );
......@@ -1043,10 +1013,11 @@ static uint32_t get_video_pts (demux_avi_t *this, long pos)
__AVI_NextIndexEntry( p_input, p_info );
return( 1 );
}
/*
intf_WarnMsg( 6, "input demux: read %4.4s chunk",
(char*)&p_chunk->i_id);
*/
intf_WarnMsg( 6, "input demux: read %4.4s chunk %d bytes",
(char*)&p_chunk->i_id,
p_chunk->i_size);
if( RIFF_LoadChunkDataInPES(p_input, p_chunk, &p_pes) != 0 )
{
intf_ErrMsg( "input error: cannot read data" );
......@@ -1057,10 +1028,8 @@ static uint32_t get_video_pts (demux_avi_t *this, long pos)
p_pes->i_pts = p_avi_demux->i_date + __AVI_GetPTS( p_info );
p_pes->i_dts = 0;
/* on update les donnes */
__AVI_NextIndexEntry( p_input, p_info );
/* send to decoder */
vlc_mutex_lock( &p_info->p_es->p_decoder_fifo->data_lock );
if( p_info->p_es->p_decoder_fifo->i_depth >= MAX_PACKETS_IN_FIFO )
{
......
......@@ -2,7 +2,7 @@
* ffmpeg.c: video decoder using ffmpeg library
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
* $Id: ffmpeg.c,v 1.1 2002/04/23 23:44:36 fenrir Exp $
* $Id: ffmpeg.c,v 1.2 2002/04/25 03:01:03 fenrir Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
......@@ -83,7 +83,7 @@ MODULE_CONFIG_STOP
MODULE_INIT_START
SET_DESCRIPTION( "ffmpeg video decoder module (MSMPEG4,MPEG4)" )
ADD_CAPABILITY( DECODER, 50 )
ADD_SHORTCUT( "ffmpeg_vdec" )
ADD_SHORTCUT( "ffmpeg" )
MODULE_INIT_STOP
MODULE_ACTIVATE_START
......@@ -94,17 +94,18 @@ MODULE_DEACTIVATE_START
MODULE_DEACTIVATE_STOP
static u16 __GetWordLittleEndianFromBuff( byte_t *p_buff )
static __inline__ u16 __GetWordLittleEndianFromBuff( byte_t *p_buff )
{
u16 i;
i = (*p_buff) + ( *(p_buff + 1) <<8 );
return ( i );
}
static u32 __GetDoubleWordLittleEndianFromBuff( byte_t *p_buff )
static __inline__ u32 __GetDoubleWordLittleEndianFromBuff( byte_t *p_buff )
{
u32 i;
i = (*p_buff) + ( *(p_buff + 1) <<8 ) + ( *(p_buff + 2) <<16 ) + ( *(p_buff + 3) <<24 );
i = (*p_buff) + ( *(p_buff + 1) <<8 ) +
( *(p_buff + 2) <<16 ) + ( *(p_buff + 3) <<24 );
return ( i );
}
......@@ -151,7 +152,7 @@ static int __ParseBitMapInfoHeader( bitmapinfoheader_t *h, byte_t *p_data )
static pes_packet_t *__PES_GET( decoder_fifo_t *p_fifo )
{
pes_packet_t *p_pes;
/* get a p_pes ie data for a frame ! */
vlc_mutex_lock( &p_fifo->data_lock );
/* if fifo is emty wait */
......@@ -232,10 +233,6 @@ static void __PACKET_NEXT( videodec_thread_t *p_vdec )
p_vdec->i_data_size = p_vdec->p_data->p_payload_end -
p_vdec->p_data->p_payload_start;
}
if( p_vdec->i_data_size == 0 )
{
p_vdec->p_data = NULL;
}
} while( p_vdec->i_data_size <= 0 );
}
......@@ -276,7 +273,6 @@ static __inline__ u32 __FfmpegChromaToFourCC( int i_ffmpegchroma )
switch( i_ffmpegchroma )
{
case( PIX_FMT_YUV420P ):
return FOURCC_I420;
case( PIX_FMT_YUV422 ):
return FOURCC_I420;
case( PIX_FMT_RGB24 ):
......@@ -312,7 +308,6 @@ static int decoder_Run ( decoder_config_t * p_config )
p_vdec->p_fifo = p_config->p_decoder_fifo;
p_vdec->p_config = p_config;
p_vdec->p_vout = NULL;
if( InitThread( p_vdec ) != 0 )
{
......@@ -364,8 +359,8 @@ static int InitThread( videodec_thread_t *p_vdec )
/* we cannot create vout because we don't know what chroma */
/*init ffmpeg */
/* XXX maybe it's not multi thread capable */
/* TODO: add a global variable to know if init was already done */
/* TODO: add a global variable to know if init was already done
in case we use it also for audio */
if( b_ffmpeginit == 0 )
{
avcodec_init();
......@@ -462,7 +457,6 @@ static void DecodeThread( videodec_thread_t *p_vdec )
int i_len;
int b_gotpicture;
int b_convert;
int i_aspect;
pes_packet_t *p_pes;
AVPicture avpicture; /* ffmpeg picture */
......@@ -485,7 +479,7 @@ static void DecodeThread( videodec_thread_t *p_vdec )
do
{
__PACKET_FILL( p_vdec );
if( p_vdec->p_fifo->b_die )
if( (p_vdec->p_fifo->b_die)||(p_vdec->p_fifo->b_error) )
{
return;
}
......@@ -528,10 +522,6 @@ static void DecodeThread( videodec_thread_t *p_vdec )
*/
/* create vout */
/* FIXME */
/*
p_vdec->i_aspect = VOUT_ASPECT_FACTOR * 4 / 3; AR_3_4_PICTURE
*/
/* ffmpeg set it for our with some codec */
if( (p_vdec->format.i_width == 0)||(p_vdec->format.i_height == 0) )
......@@ -540,32 +530,15 @@ static void DecodeThread( videodec_thread_t *p_vdec )
p_vdec->format.i_height = p_vdec->p_context->height;
}
/* calculate i_aspect */
i_aspect = VOUT_ASPECT_FACTOR * p_vdec->format.i_width /
p_vdec->format.i_height;
/* FIXME comment faire ca proprement */
/*
if( i_aspect == VOUT_ASPECT_FACTOR * 4 /3 )
{
i_aspect = 1;
}
else
{
if( i_aspect == VOUT_ASPECT_FACTOR * 16 /9 )
{
i_aspect = 2;
}
}
*/
p_vdec->i_aspect = i_aspect;
p_vdec->i_aspect = VOUT_ASPECT_FACTOR * p_vdec->format.i_width /
p_vdec->format.i_height;
p_vdec->i_chroma = i_chroma;
intf_WarnMsg( 1, "vdec info: creating vout %dx%d chroma %4.4s %s %s",
intf_WarnMsg( 1, "vdec info: creating vout %dx%d chroma %4.4s %s",
p_vdec->format.i_width,
p_vdec->format.i_height,
(char*)&i_chroma,
b_convert ? "(with convertion)" : "",
/*i_aspect ==1 ? "aspect 4:3" : "aspect 16:9"*/
"free aspect" );
(char*)&p_vdec->i_chroma,
b_convert ? "(with convertion)" : "" );
p_vdec->p_vout = vout_CreateThread(
NULL,
......
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