X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fdmo%2Fdmo.c;h=33c30775765ccf0db381d5ab3c2062d5e6204a62;hb=1e7cd2c85a338ef153002325ae40cc90517f51e1;hp=3875791fee4ef84b9b57ec54e914d52eaee24326;hpb=89b6530d8abd99b96b9f33af022022241fe97ee2;p=vlc diff --git a/modules/codec/dmo/dmo.c b/modules/codec/dmo/dmo.c index 3875791fee..33c3077576 100644 --- a/modules/codec/dmo/dmo.c +++ b/modules/codec/dmo/dmo.c @@ -32,13 +32,13 @@ #include #include #include -#include #include #ifndef WIN32 # define LOADER #else # include +# include #endif #ifdef LOADER @@ -104,7 +104,7 @@ vlc_module_begin () set_capability( "decoder", 1 ) set_callbacks( DecoderOpen, DecoderClose ) set_category( CAT_INPUT ) - set_subcategory( SUBCAT_INPUT_SCODEC ) + set_subcategory( SUBCAT_INPUT_VCODEC ) # define ENC_CFG_PREFIX "sout-dmo-" add_submodule () @@ -521,14 +521,16 @@ static int DecOpen( decoder_t *p_dec ) p_dec->fmt_out.video.i_bits_per_pixel = i_bpp; /* If an aspect-ratio was specified in the input format then force it */ - if( p_dec->fmt_in.video.i_aspect ) + if( p_dec->fmt_in.video.i_sar_num > 0 && + p_dec->fmt_in.video.i_sar_den > 0 ) { - p_dec->fmt_out.video.i_aspect = p_dec->fmt_in.video.i_aspect; + p_dec->fmt_out.video.i_sar_num = p_dec->fmt_in.video.i_sar_num; + p_dec->fmt_out.video.i_sar_den = p_dec->fmt_in.video.i_sar_den; } else { - p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR * - p_dec->fmt_out.video.i_width / p_dec->fmt_out.video.i_height; + p_dec->fmt_out.video.i_sar_num = 1; + p_dec->fmt_out.video.i_sar_den = 1; } p_bih = &p_vih->bmiHeader; @@ -727,8 +729,7 @@ static int LoadDMO( vlc_object_t *p_this, HINSTANCE *p_hmsdmo_dll, while( ( S_OK == p_enum_dmo->vt->Next( p_enum_dmo, 1, &clsid_dmo, &psz_dmo_name, &i_dummy /* NULL doesn't work */ ) ) ) { - char psz_temp[MAX_PATH]; - wcstombs( psz_temp, psz_dmo_name, MAX_PATH ); + char *psz_temp = FromWide( psz_dmo_name ); msg_Dbg( p_this, "found DMO: %s", psz_temp ); CoTaskMemFree( psz_dmo_name ); @@ -737,9 +738,14 @@ static int LoadDMO( vlc_object_t *p_this, HINSTANCE *p_hmsdmo_dll, &IID_IMediaObject, (void **)pp_dmo ) ) { msg_Warn( p_this, "can't create DMO: %s", psz_temp ); + free( psz_temp ); *pp_dmo = 0; } - else break; + else + { + free( psz_temp ); + break; + } } p_enum_dmo->vt->Release( (IUnknown *)p_enum_dmo ); @@ -782,7 +788,7 @@ loader: } i_err = GetClass( codecs_table[i_codec].p_guid, &IID_IClassFactory, - (void**)&cFactory ); + &cFactory ); if( i_err || cFactory == NULL ) { msg_Dbg( p_this, "no such class object" ); @@ -791,7 +797,7 @@ loader: } i_err = cFactory->vt->CreateInstance( cFactory, 0, &IID_IUnknown, - (void**)&cObject ); + &cObject ); cFactory->vt->Release( (IUnknown*)cFactory ); if( i_err || !cObject ) { @@ -800,7 +806,7 @@ loader: return VLC_EGENERIC; } i_err = cObject->vt->QueryInterface( cObject, &IID_IMediaObject, - (void**)pp_dmo ); + pp_dmo ); cObject->vt->Release( (IUnknown*)cObject ); if( i_err || !*pp_dmo ) { @@ -852,10 +858,11 @@ static void *DecBlock( decoder_t *p_dec, block_t **pp_block ) p_block = *pp_block; /* Won't work with streams with B-frames, but do we have any ? */ - if( p_block && p_block->i_pts <= 0 ) p_block->i_pts = p_block->i_dts; + if( p_block && p_block->i_pts <= VLC_TS_INVALID ) + p_block->i_pts = p_block->i_dts; /* Date management */ - if( p_block && p_block->i_pts > 0 && + if( p_block && 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 ); @@ -903,7 +910,9 @@ static void *DecBlock( decoder_t *p_dec, block_t **pp_block ) } else { - //msg_Dbg( p_dec, "ProcessInput(): successful" ); +#ifdef DMO_DEBUG + msg_Dbg( p_dec, "ProcessInput(): successful" ); +#endif *pp_block = NULL; } } @@ -980,9 +989,10 @@ static void *DecBlock( decoder_t *p_dec, block_t **pp_block ) memcpy( p_aout_buffer->p_buffer, block_out.p_buffer, block_out.i_buffer ); /* Date management */ - p_aout_buffer->start_date = date_Get( &p_sys->end_date ); - p_aout_buffer->end_date = - date_Increment( &p_sys->end_date, i_samples ); + p_aout_buffer->i_pts = date_Get( &p_sys->end_date ); + p_aout_buffer->i_length = + date_Increment( &p_sys->end_date, i_samples ) + - p_aout_buffer->i_pts; } p_out->vt->Release( (IUnknown *)p_out ); @@ -1199,7 +1209,7 @@ static int EncoderSetVideoType( encoder_t *p_enc, IMediaObject *p_dmo ) i_err = p_dmo->vt->QueryInterface( (IUnknown *)p_dmo, &IID_IWMCodecPrivateData, - (void **)&p_privdata ); + &p_privdata ); if( i_err ) break; i_err = p_privdata->vt->SetPartialOutputType( p_privdata, &dmo_type ); @@ -1533,11 +1543,11 @@ static block_t *EncodeBlock( encoder_t *p_enc, void *p_data ) else { aout_buffer_t *p_aout_buffer = (aout_buffer_t *)p_data; - p_block_in = block_New( p_enc, p_aout_buffer->i_nb_bytes ); + p_block_in = block_New( p_enc, p_aout_buffer->i_buffer ); memcpy( p_block_in->p_buffer, p_aout_buffer->p_buffer, p_block_in->i_buffer ); - i_pts = p_aout_buffer->start_date; + i_pts = p_aout_buffer->i_pts; } /* Feed input to the DMO */