X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Frealvideo.c;h=3e43f56c97134f9a4d1033e55c801517d5ea6bda;hb=ddfbaea04ac415ce036350e3f2244b6f6bb881dc;hp=40d0542c72d4b5d9769d3400c7b7a8cd33c97427;hpb=cc6941a5134af40e0a41620215bf9efe8ab5ba94;p=vlc diff --git a/modules/codec/realvideo.c b/modules/codec/realvideo.c index 40d0542c72..3e43f56c97 100644 --- a/modules/codec/realvideo.c +++ b/modules/codec/realvideo.c @@ -28,7 +28,6 @@ #include #include -#include #include #ifdef LOADER @@ -128,13 +127,13 @@ static void Close( vlc_object_t * ); //static int OpenPacketizer( vlc_object_t * ); static picture_t *DecodeVideo( decoder_t *, block_t ** ); -vlc_module_begin(); - set_description( N_("RealVideo library decoder") ); - set_capability( "decoder", 10 ); - set_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_VCODEC ); - set_callbacks( Open, Close ); -vlc_module_end(); +vlc_module_begin () + set_description( N_("RealVideo library decoder") ) + set_capability( "decoder", 10 ) + set_category( CAT_INPUT ) + set_subcategory( SUBCAT_INPUT_VCODEC ) + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** @@ -146,15 +145,15 @@ static void * load_syms(decoder_t *p_dec, const char *path) { void *handle; - msg_Dbg( p_dec, "opening win32 dll '%s'\n", path); + msg_Dbg( p_dec, "opening win32 dll '%s'", path); #ifdef LOADER Setup_LDT_Keeper(); #endif handle = LoadLibraryA(path); - msg_Dbg( p_dec, "win32 real codec handle=%p \n",handle); + msg_Dbg( p_dec, "win32 real codec handle=%p",handle); if (!handle) { - msg_Err( p_dec, "Error loading dll\n"); + msg_Err( p_dec, "Error loading dll"); return NULL; } @@ -168,7 +167,7 @@ static void * load_syms(decoder_t *p_dec, const char *path) dll_type = 1; return handle; } - msg_Err( p_dec, "Error resolving symbols! (version incompatibility?)\n"); + msg_Err( p_dec, "Error resolving symbols! (version incompatibility?)"); FreeLibrary(handle); return NULL; // error } @@ -177,12 +176,12 @@ static void * load_syms_linux(decoder_t *p_dec, const char *path) { void *handle; - msg_Dbg( p_dec, "opening shared obj '%s'\n", path); + msg_Dbg( p_dec, "opening shared obj '%s'", path); handle = dlopen (path, RTLD_LAZY); if (!handle) { - msg_Err( p_dec,"Error: %s\n",dlerror()); + msg_Err( p_dec,"Error: %s",dlerror()); return NULL; } @@ -197,24 +196,27 @@ static void * load_syms_linux(decoder_t *p_dec, const char *path) return handle; } - msg_Err( p_dec,"Error resolving symbols! (version incompatibility?)\n"); + msg_Err( p_dec,"Error resolving symbols! (version incompatibility?)"); dlclose(handle); return 0; } #endif +static vlc_mutex_t rm_mutex = VLC_STATIC_MUTEX; + static int InitVideo(decoder_t *p_dec) { int result; struct rv_init_t init_data; char fcc[4]; - vlc_mutex_t *lock; char *g_decode_path; int i_vide = p_dec->fmt_in.i_extra; unsigned int *p_vide = p_dec->fmt_in.p_extra; - decoder_sys_t *p_sys = malloc( sizeof( decoder_sys_t ) ); - memset(p_sys,0,sizeof( decoder_sys_t ) ); + decoder_sys_t *p_sys = calloc( 1, sizeof( decoder_sys_t ) ); + + if( !p_sys ) + return VLC_ENOMEM; if( i_vide < 8 ) { @@ -222,7 +224,7 @@ static int InitVideo(decoder_t *p_dec) free( p_sys ); return VLC_EGENERIC; } - if (p_sys->plane) free(p_sys->plane); + free( p_sys->plane ); p_sys->plane = malloc (p_dec->fmt_in.video.i_width*p_dec->fmt_in.video.i_height*3/2 + 1024 ); if (NULL == p_sys->plane) { @@ -309,9 +311,7 @@ static int InitVideo(decoder_t *p_dec) return VLC_EGENERIC; } - lock = var_AcquireMutex( "rm_mutex" ); - if ( lock == NULL ) - return VLC_EGENERIC; + vlc_mutex_lock( &rm_mutex ); p_sys->handle=NULL; #ifdef WIN32 @@ -328,7 +328,7 @@ static int InitVideo(decoder_t *p_dec) } /* setup rv30 codec (codec sub-type and image dimensions): */ - /*if ( p_dec->fmt_in.i_codec == VLC_FOURCC('R','V','3','0') )*/ + /*if ( p_dec->fmt_in.i_codec == VLC_CODEC_RV30 )*/ if (p_vide[1]>=0x20200002) { int i, cmsg_cnt; @@ -348,17 +348,18 @@ static int InitVideo(decoder_t *p_dec) (*rvyuv_custom_message)(&cmsg_data,p_sys->handle); } /* - es_format_Init( &p_dec->fmt_out, VIDEO_ES, VLC_FOURCC( 'Y','V','1','2' )); - es_format_Init( &p_dec->fmt_out, VIDEO_ES, VLC_FOURCC( 'Y','U','Y','2' )); + es_format_Init( &p_dec->fmt_out, VIDEO_ES, VLC_CODEC_YV12); + es_format_Init( &p_dec->fmt_out, VIDEO_ES, VLC_CODEC_YUYV); */ - es_format_Init( &p_dec->fmt_out, VIDEO_ES, VLC_FOURCC( 'I', '4', '2', '0')); + es_format_Init( &p_dec->fmt_out, VIDEO_ES, VLC_CODEC_I420); p_dec->fmt_out.video.i_width = p_dec->fmt_in.video.i_width; p_dec->fmt_out.video.i_height= p_dec->fmt_in.video.i_height; - p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR * p_dec->fmt_in.video.i_width / p_dec->fmt_in.video.i_height; + p_dec->fmt_out.video.i_sar_num = 1; + p_dec->fmt_out.video.i_sar_den = 1; p_sys->inited = 0; - vlc_mutex_unlock( lock ); + vlc_mutex_unlock( &rm_mutex ); return VLC_SUCCESS; } @@ -372,15 +373,12 @@ static int Open( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t*)p_this; - /* create a mutex */ - var_Create( p_this->p_libvlc, "rm_mutex", VLC_VAR_MUTEX ); - switch ( p_dec->fmt_in.i_codec ) { - case VLC_FOURCC('R','V','1','0'): - case VLC_FOURCC('R','V','2','0'): - case VLC_FOURCC('R','V','3','0'): - case VLC_FOURCC('R','V','4','0'): + case VLC_CODEC_RV10: + case VLC_CODEC_RV20: + case VLC_CODEC_RV30: + case VLC_CODEC_RV40: p_dec->p_sys = NULL; p_dec->pf_decode_video = DecodeVideo; return InitVideo(p_dec); @@ -397,10 +395,9 @@ static void Close( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t*)p_this; decoder_sys_t *p_sys = p_dec->p_sys; - vlc_mutex_t *lock; /* get lock, avoid segfault */ - lock = var_AcquireMutex( "rm_mutex" ); + vlc_mutex_lock( &rm_mutex ); #ifdef WIN32 if (dll_type == 1) @@ -422,11 +419,8 @@ static void Close( vlc_object_t *p_this ) #endif p_sys->rv_handle=NULL; - if (p_sys->plane) - { - free(p_sys->plane); - p_sys->plane = NULL; - } + free( p_sys->plane ); + p_sys->plane = NULL; msg_Dbg( p_dec, "FreeLibrary ok." ); #ifdef LOADER @@ -435,11 +429,9 @@ static void Close( vlc_object_t *p_this ) #endif p_sys->inited = 0; - if ( lock ) - vlc_mutex_unlock( lock ); + vlc_mutex_unlock( &rm_mutex ); - if ( p_sys ) - free( p_sys ); + free( p_sys ); } /***************************************************************************** @@ -448,7 +440,6 @@ static void Close( vlc_object_t *p_this ) static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block ) { decoder_sys_t *p_sys = p_dec->p_sys; - vlc_mutex_t *lock; block_t *p_block; picture_t *p_pic; mtime_t i_pts; @@ -463,13 +454,11 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block ) p_block = *pp_block; *pp_block = NULL; - i_pts = p_block->i_pts ? p_block->i_pts : p_block->i_dts; + i_pts = (p_block->i_pts > VLC_TS_INVALID) ? p_block->i_pts : p_block->i_dts; - lock = var_AcquireMutex( "rm_mutex" ); - if ( lock == NULL ) - return NULL; + vlc_mutex_lock( &rm_mutex ); - p_pic = p_dec->pf_vout_buffer_new( p_dec ); + p_pic = decoder_NewPicture( p_dec ); if ( p_pic ) { @@ -520,7 +509,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block ) || p_dec->fmt_in.video.i_height != transform_out[4] ) { msg_Warn(p_dec, "Warning, Real's Header give a wrong " - "information about media's width and height!\n" + "information about media's width and height!" "\tRealHeader: \t %d X %d \t %d X %d", p_dec->fmt_in.video.i_width, p_dec->fmt_in.video.i_height, @@ -536,7 +525,8 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block ) p_dec->fmt_out.video.i_visible_height = p_dec->fmt_in.video.i_height= transform_out[4]; - p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR * p_dec->fmt_in.video.i_width / p_dec->fmt_in.video.i_height; + p_dec->fmt_out.video.i_sar_num = 1; + p_dec->fmt_out.video.i_sar_den = 1; } else { @@ -559,7 +549,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block ) p_pic->b_force = 1; } - vlc_mutex_unlock( lock ); + vlc_mutex_unlock( &rm_mutex ); block_Release( p_block ); return p_pic;