#include "intf_msg.h"
#include "main.h"
-#include "vdec_idct.h"
-#include "video_decoder.h"
-
/*****************************************************************************
* Local prototypes
*****************************************************************************/
int i_best_index = 0, i_best_score = 0;
/* Allocate descriptor */
- intf_DbgMsg("\n");
p_vout = (vout_thread_t *) malloc( sizeof(vout_thread_t) );
if( p_vout == NULL )
{
- intf_ErrMsg( "vout error: %s\n", strerror(ENOMEM) );
+ intf_ErrMsg( "vout error: vout thread creation returned %s",
+ strerror(ENOMEM) );
return( NULL );
}
p_vout->b_grayscale = main_GetIntVariable( VOUT_GRAYSCALE_VAR,
VOUT_GRAYSCALE_DEFAULT );
- p_vout->vdec_DecodeMacroblock = vdec_DecodeMacroblockC;
p_vout->b_info = 0;
p_vout->b_interface = 0;
p_vout->b_scale = 1;
- intf_DbgMsg( "wished configuration: %dx%d, %d/%d bpp (%d Bpl)\n",
+ intf_DbgMsg( "wished configuration: %dx%d, %d/%d bpp (%d Bpl)",
p_vout->i_width, p_vout->i_height, p_vout->i_screen_depth,
p_vout->i_bytes_per_pixel * 8, p_vout->i_bytes_per_line );
return( NULL );
}
intf_DbgMsg( "actual configuration: %dx%d, %d/%d bpp (%d Bpl), "
- "masks: 0x%x/0x%x/0x%x\n",
+ "masks: 0x%x/0x%x/0x%x",
p_vout->i_width, p_vout->i_height, p_vout->i_screen_depth,
p_vout->i_bytes_per_pixel * 8, p_vout->i_bytes_per_line,
p_vout->i_red_mask, p_vout->i_green_mask,
}
if( p_vout->p_default_font == NULL )
{
- intf_ErrMsg( "vout error: could not load default font\n" );
+ intf_ErrMsg( "vout error: could not load default font" );
p_vout->p_sys_destroy( p_vout );
free( p_vout );
return( NULL );
}
if( p_vout->p_large_font == NULL )
{
- intf_ErrMsg( "vout error: could not load large font\n" );
+ intf_ErrMsg( "vout error: could not load large font" );
vout_UnloadFont( p_vout->p_default_font );
p_vout->p_sys_destroy( p_vout );
free( p_vout );
vlc_mutex_init( &p_vout->picture_lock );
vlc_mutex_init( &p_vout->subpicture_lock );
vlc_mutex_init( &p_vout->change_lock );
- vlc_mutex_lock( &p_vout->change_lock );
+
if( vlc_thread_create( &p_vout->thread_id, "video output",
(void *) RunThread, (void *) p_vout) )
{
- intf_ErrMsg("vout error: %s\n", strerror(ENOMEM));
+ intf_ErrMsg("vout error: %s", strerror(ENOMEM));
vout_UnloadFont( p_vout->p_default_font );
vout_UnloadFont( p_vout->p_large_font );
p_vout->p_sys_destroy( p_vout );
return( NULL );
}
- intf_Msg( "Video display initialized (%dx%d, %d/%d bpp)\n", p_vout->i_width,
+ intf_Msg( "Video display initialized (%dx%d, %d/%d bpp)", p_vout->i_width,
p_vout->i_height, p_vout->i_screen_depth,
p_vout->i_bytes_per_pixel * 8 );
int i_status; /* thread status */
/* Set status */
- intf_DbgMsg("\n");
+ intf_DbgMsg("");
p_vout->pi_status = (pi_status != NULL) ? pi_status : &i_status;
*p_vout->pi_status = THREAD_DESTROY;
/* Check if status is valid */
if( p_subpic->i_status != RESERVED_SUBPICTURE )
{
- intf_DbgMsg("error: subpicture %p has invalid status %d\n", p_subpic,
+ intf_DbgMsg("error: subpicture %p has invalid status %d", p_subpic,
p_subpic->i_status );
}
#endif
#ifdef DEBUG_VOUT
/* Send subpicture information */
- intf_DbgMsg("subpicture %p: type=%d, begin date=%s, end date=%s\n",
+ intf_DbgMsg("subpicture %p: type=%d, begin date=%s, end date=%s",
p_subpic, p_subpic->i_type,
mstrtime( psz_begin_date, p_subpic->begin_date ),
mstrtime( psz_end_date, p_subpic->end_date ) );
* to be done */
p_vout->p_subpicture[i_subpic].i_status = RESERVED_SUBPICTURE;
#ifdef DEBUG_VOUT
- intf_DbgMsg("subpicture %p (in destroyed subpicture slot)\n",
+ intf_DbgMsg("subpicture %p (in destroyed subpicture slot)",
&p_vout->p_subpicture[i_subpic] );
#endif
vlc_mutex_unlock( &p_vout->subpicture_lock );
break;
#ifdef DEBUG
default:
- intf_DbgMsg("error: unknown subpicture type %d\n", i_type );
+ intf_DbgMsg("error: unknown subpicture type %d", i_type );
p_free_subpic->p_data = NULL;
break;
#endif
p_free_subpic->i_type = EMPTY_SUBPICTURE;
p_free_subpic->i_status = FREE_SUBPICTURE;
p_free_subpic = NULL;
- intf_ErrMsg("spu warning: %s\n", strerror( ENOMEM ) );
+ intf_ErrMsg( "vout error: spu allocation returned %s",
+ strerror( ENOMEM ) );
}
#ifdef DEBUG_VOUT
- intf_DbgMsg("subpicture %p (in free subpicture slot)\n", p_free_subpic );
+ intf_DbgMsg("subpicture %p (in free subpicture slot)", p_free_subpic );
#endif
vlc_mutex_unlock( &p_vout->subpicture_lock );
return( p_free_subpic );
}
/* No free or destroyed subpicture could be found */
- intf_DbgMsg( "warning: subpicture heap is full\n" );
+ intf_DbgMsg( "warning: subpicture heap is full" );
vlc_mutex_unlock( &p_vout->subpicture_lock );
return( NULL );
}
/* Check if status is valid */
if( p_subpic->i_status != RESERVED_SUBPICTURE )
{
- intf_DbgMsg("error: subpicture %p has invalid status %d\n",
+ intf_DbgMsg("error: subpicture %p has invalid status %d",
p_subpic, p_subpic->i_status );
}
#endif
p_subpic->i_status = DESTROYED_SUBPICTURE;
#ifdef DEBUG_VOUT
- intf_DbgMsg("subpicture %p\n", p_subpic);
+ intf_DbgMsg("subpicture %p", p_subpic);
#endif
}
break;
#ifdef DEBUG
default:
- intf_DbgMsg("error: picture %p has invalid status %d\n", p_pic, p_pic->i_status );
+ intf_DbgMsg("error: picture %p has invalid status %d", p_pic, p_pic->i_status );
break;
#endif
}
#ifdef DEBUG_VOUT
- intf_DbgMsg("picture %p\n", p_pic);
+ intf_DbgMsg("picture %p", p_pic);
#endif
vlc_mutex_unlock( &p_vout->picture_lock );
}
break;
#ifdef DEBUG
default:
- intf_DbgMsg("error: picture %p has invalid status %d\n", p_pic, p_pic->i_status );
+ intf_DbgMsg("error: picture %p has invalid status %d", p_pic, p_pic->i_status );
break;
#endif
}
#ifdef DEBUG_VOUT
- intf_DbgMsg("picture %p, display date: %s\n", p_pic, mstrtime( psz_date, p_pic->date) );
+ intf_DbgMsg("picture %p, display date: %s", p_pic, mstrtime( psz_date, p_pic->date) );
#endif
vlc_mutex_unlock( &p_vout->picture_lock );
}
p_vout->p_picture[i_picture].i_status = RESERVED_PICTURE;
p_vout->i_pictures++;
#ifdef DEBUG_VOUT
- intf_DbgMsg("picture %p (in destroyed picture slot)\n",
+ intf_DbgMsg("picture %p (in destroyed picture slot)",
&p_vout->p_picture[i_picture] );
#endif
vlc_mutex_unlock( &p_vout->picture_lock );
break;
#ifdef DEBUG
default:
- intf_DbgMsg("error: unknown picture type %d\n", i_type );
+ intf_DbgMsg("error: unknown picture type %d", i_type );
p_free_picture->p_data = NULL;
break;
#endif
p_free_picture->i_type = EMPTY_PICTURE;
p_free_picture->i_status = FREE_PICTURE;
p_free_picture = NULL;
- intf_ErrMsg( "vout warning: %s\n", strerror( ENOMEM ) );
+ intf_ErrMsg( "vout error: picture allocation returned %s",
+ strerror( ENOMEM ) );
}
#ifdef DEBUG_VOUT
- intf_DbgMsg("picture %p (in free picture slot)\n", p_free_picture );
+ intf_DbgMsg("picture %p (in free picture slot)", p_free_picture );
#endif
vlc_mutex_unlock( &p_vout->picture_lock );
+
+ /* Initialize mutex */
+ vlc_mutex_init( &(p_free_picture->lock_deccount) );
+
return( p_free_picture );
}
/* No free or destroyed picture could be found */
- intf_DbgMsg( "warning: picture heap is full\n" );
+ intf_DbgMsg( "warning: picture heap is full" );
vlc_mutex_unlock( &p_vout->picture_lock );
return( NULL );
}
*****************************************************************************/
void vout_DestroyPicture( vout_thread_t *p_vout, picture_t *p_pic )
{
- vlc_mutex_lock( &p_vout->picture_lock );
+ vlc_mutex_lock( &p_vout->picture_lock );
#ifdef DEBUG
- /* Check if picture status is valid */
- if( (p_pic->i_status != RESERVED_PICTURE) &&
- (p_pic->i_status != RESERVED_DATED_PICTURE) &&
- (p_pic->i_status != RESERVED_DISP_PICTURE) )
- {
- intf_DbgMsg("error: picture %p has invalid status %d\n", p_pic, p_pic->i_status );
- }
+ /* Check if picture status is valid */
+ if( (p_pic->i_status != RESERVED_PICTURE) &&
+ (p_pic->i_status != RESERVED_DATED_PICTURE) &&
+ (p_pic->i_status != RESERVED_DISP_PICTURE) )
+ {
+ intf_DbgMsg("error: picture %p has invalid status %d", p_pic, p_pic->i_status );
+ }
#endif
- p_pic->i_status = DESTROYED_PICTURE;
- p_vout->i_pictures--;
+ p_pic->i_status = DESTROYED_PICTURE;
+ p_vout->i_pictures--;
#ifdef DEBUG_VOUT
- intf_DbgMsg("picture %p\n", p_pic);
+ intf_DbgMsg("picture %p", p_pic);
#endif
- vlc_mutex_unlock( &p_vout->picture_lock );
+
+ /* destroy the lock that had been initialized in CreatePicture */
+ vlc_mutex_destroy( &(p_pic->lock_deccount) );
+
+ vlc_mutex_unlock( &p_vout->picture_lock );
}
/*****************************************************************************
p_pic->i_refcount++;
#ifdef DEBUG_VOUT
- intf_DbgMsg("picture %p refcount=%d\n", p_pic, p_pic->i_refcount );
+ intf_DbgMsg("picture %p refcount=%d", p_pic, p_pic->i_refcount );
#endif
vlc_mutex_unlock( &p_vout->picture_lock );
#ifdef DEBUG_VOUT
if( p_pic->i_refcount < 0 )
{
- intf_DbgMsg("error: refcount < 0\n");
+ intf_DbgMsg("error: refcount < 0");
p_pic->i_refcount = 0;
}
#endif
}
#ifdef DEBUG_VOUT
- intf_DbgMsg("picture %p refcount=%d\n", p_pic, p_pic->i_refcount );
+ intf_DbgMsg("picture %p refcount=%d", p_pic, p_pic->i_refcount );
#endif
vlc_mutex_unlock( &p_vout->picture_lock );
*****************************************************************************/
static int BinaryLog(u32 i)
{
- int i_log;
+ int i_log = 0;
- i_log = 0;
- if (i & 0xffff0000)
+ if(i & 0xffff0000)
{
- i_log = 16;
+ i_log += 16;
}
- if (i & 0xff00ff00)
+ if(i & 0xff00ff00)
{
- i_log += 8;
+ i_log += 8;
}
- if (i & 0xf0f0f0f0)
+ if(i & 0xf0f0f0f0)
{
- i_log += 4;
+ i_log += 4;
}
- if (i & 0xcccccccc)
+ if(i & 0xcccccccc)
{
- i_log += 2;
+ i_log += 2;
}
- if (i & 0xaaaaaaaa)
+ if(i & 0xaaaaaaaa)
{
- i_log++;
+ i_log += 1;
}
+
if (i != ((u32)1 << i_log))
{
- intf_DbgMsg("internal error: binary log overflow\n");
+ intf_DbgMsg("internal error: binary log overflow");
}
return( i_log );
static int InitThread( vout_thread_t *p_vout )
{
/* Update status */
- intf_DbgMsg("\n");
*p_vout->pi_status = THREAD_START;
+ vlc_mutex_lock( &p_vout->change_lock );
+
#ifdef STATS
p_vout->c_loops = 0;
#endif
/* Initialize convertion tables and functions */
if( vout_InitYUV( p_vout ) )
{
- intf_ErrMsg("error: can't allocate YUV translation tables\n");
+ intf_ErrMsg("vout error: can't allocate YUV translation tables");
return( 1 );
}
}
*p_vout->pi_status = THREAD_READY;
- intf_DbgMsg("thread ready\n");
+ intf_DbgMsg("thread ready");
return( 0 );
}
DestroyThread( p_vout, THREAD_ERROR );
return;
}
- intf_DbgMsg("\n");
/*
* Main loop - it is not executed if an error occured during
p_vout->c_loops++;
if( !(p_vout->c_loops % VOUT_STATS_NB_LOOPS) )
{
- intf_Msg("vout stats: picture heap: %d/%d\n",
+ intf_Msg("vout stats: picture heap: %d/%d",
p_vout->i_pictures, VOUT_MAX_PICTURES);
}
#endif
p_vout->i_pictures--;
}
intf_WarnMsg( 3,
- "warning: late picture skipped (%p)\n", p_pic );
+ "warning: late picture skipped (%p)", p_pic );
vlc_mutex_unlock( &p_vout->picture_lock );
continue;
p_vout->last_display_date = display_date;
p_vout->p_rendered_pic = p_pic;
+
+
+
+ /* Set picture dimensions and clear buffer */
+ SetBufferPicture( p_vout, p_pic );
+
/* FIXME: if b_need_render == 0 we need to do something with
* the subpictures one day. */
+
if( p_vout->b_need_render && b_display )
{
- /* Set picture dimensions and clear buffer */
- SetBufferPicture( p_vout, p_pic );
-
/* Render picture and information */
RenderPicture( p_vout, p_pic );
if( p_vout->b_info )
} else {
/* no splash screen ! */
- intf_ErrMsgImm("End of splash screen\n");
p_vout->init_display_date=0;
}
}
* then swap buffers */
vlc_mutex_lock( &p_vout->change_lock );
#ifdef DEBUG_VOUT
- intf_DbgMsg( "picture %p, subpicture %p in buffer %d, display=%d\n", p_pic, p_subpic,
+ intf_DbgMsg( "picture %p, subpicture %p in buffer %d, display=%d", p_pic, p_subpic,
p_vout->i_buffer_index, b_display /* && !(p_vout->i_changes & VOUT_NODISPLAY_CHANGE) */ );
#endif
if( b_display /* && !(p_vout->i_changes & VOUT_NODISPLAY_CHANGE) */ )
/* End of thread */
EndThread( p_vout );
DestroyThread( p_vout, THREAD_OVER );
- intf_DbgMsg( "thread end\n" );
+ intf_DbgMsg( "thread end" );
}
/*****************************************************************************
static void ErrorThread( vout_thread_t *p_vout )
{
/* Wait until a `die' order */
- intf_DbgMsg("\n");
while( !p_vout->b_die )
{
/* Sleep a while */
int i_index; /* index in heap */
/* Store status */
- intf_DbgMsg("\n");
*p_vout->pi_status = THREAD_END;
#ifdef STATS
struct tms cpu_usage;
times( &cpu_usage );
- intf_Msg("vout stats: cpu usage (user: %d, system: %d)\n",
- cpu_usage.tms_utime, cpu_usage.tms_stime);
+ intf_Msg( "vout stats: cpu usage (user: %d, system: %d)",
+ cpu_usage.tms_utime, cpu_usage.tms_stime );
}
#endif
free( p_vout->p_picture[i_index].p_data );
}
}
+
for( i_index = 0; i_index < VOUT_MAX_SUBPICTURES; i_index++ )
{
if( p_vout->p_subpicture[i_index].i_status != FREE_SUBPICTURE )
/* Destroy translation tables */
vout_EndYUV( p_vout );
p_vout->p_sys_end( p_vout );
+
+ /* Release the change lock */
+ vlc_mutex_unlock( &p_vout->change_lock );
}
/*****************************************************************************
int *pi_status; /* status adress */
/* Store status adress */
- intf_DbgMsg("\n");
pi_status = p_vout->pi_status;
/* Destroy thread structures allocated by Create and InitThread */
vout_UnloadFont( p_vout->p_large_font );
p_vout->p_sys_destroy( p_vout );
+ /* Destroy the locks */
+ vlc_mutex_destroy( &p_vout->picture_lock );
+ vlc_mutex_destroy( &p_vout->subpicture_lock );
+ vlc_mutex_destroy( &p_vout->change_lock );
+
/* Free structure */
free( p_vout );
*pi_status = i_status;
else
{
#ifdef DEBUG_VOUT
- intf_DbgMsg("area overflow\n");
+ intf_DbgMsg("area overflow");
#endif
p_buffer->pi_area_end[VOUT_MAX_AREAS - 1] = i_h;
}
if( p_buffer->i_areas == VOUT_MAX_AREAS )
{
#ifdef DEBUG_VOUT
- intf_DbgMsg("areas overflow\n");
+ intf_DbgMsg("areas overflow");
#endif
p_buffer->pi_area_end[VOUT_MAX_AREAS - 2] = p_buffer->pi_area_end[VOUT_MAX_AREAS - 1];
}
/* Set picture position */
i_pic_x = (p_vout->i_width - i_pic_width) / 2;
i_pic_y = (p_vout->i_height - i_pic_height) / 2;
+
}
else
{
for( i_area = 0; i_area < p_buffer->i_areas; i_area++ )
{
#ifdef DEBUG_VOUT
- intf_DbgMsg("clearing picture %p area in buffer %d: %d-%d\n", p_pic,
+ intf_DbgMsg("clearing picture %p area in buffer %d: %d-%d", p_pic,
p_vout->i_buffer_index, p_buffer->pi_area_begin[i_area], p_buffer->pi_area_end[i_area] );
#endif
i_data_size = (p_buffer->pi_area_end[i_area] - p_buffer->pi_area_begin[i_area] + 1) * p_vout->i_bytes_per_line;
#ifdef DEBUG_VOUT
render_time = mdate();
#endif
+
+
/*
* Choose appropriate rendering function and render picture
*/
break;
#ifdef DEBUG
default:
- intf_DbgMsg("error: unknown picture type %d\n", p_pic->i_type );
+ intf_DbgMsg("error: unknown picture type %d", p_pic->i_type );
break;
#endif
}
#ifdef DEBUG_VOUT
/* Print picture date and rendering time */
- intf_DbgMsg("picture %p rendered in buffer %d (%ld us), display date: %s\n", p_pic,
+ intf_DbgMsg("picture %p rendered in buffer %d (%ld us), display date: %s", p_pic,
p_vout->i_buffer_index, (long) (mdate() - render_time),
mstrtime( psz_date, p_pic->date ));
#endif
#ifdef DEBUG
default:
- intf_DbgMsg( "error: unknown subpicture %p type %d\n",
+ intf_DbgMsg( "error: unknown subpicture %p type %d",
p_subpic, p_subpic->i_type );
#endif
}
#ifdef DEBUG_VOUT
if( p_vout->i_changes )
{
- intf_DbgMsg("changes: 0x%x (no display: 0x%x)\n", p_vout->i_changes,
+ intf_DbgMsg("changes: 0x%x (no display: 0x%x)", p_vout->i_changes,
0 /* p_vout->i_changes & VOUT_NODISPLAY_CHANGE */ );
}
#endif
if( p_vout->i_changes & (VOUT_GAMMA_CHANGE | VOUT_GRAYSCALE_CHANGE |
VOUT_YUV_CHANGE) )
{
- /* Change vdec_DecodeMacroblock when switching between BW and C */
- if( !p_vout->b_grayscale )
- {
- p_vout->vdec_DecodeMacroblock = vdec_DecodeMacroblockC;
- }
- else if( p_vout->b_grayscale)
- {
- p_vout->vdec_DecodeMacroblock = vdec_DecodeMacroblockBW;
- }
if( vout_ResetYUV( p_vout ) )
{
- intf_ErrMsg("error: can't rebuild convertion tables\n");
+ intf_ErrMsg( "vout error: can't rebuild conversion tables" );
return( 1 );
}
}
{
/* Some changes were not acknowledged by p_vout->p_sys_manage or this
* function, it means they should not be authorized */
- intf_ErrMsg( "error: unauthorized changes in the video output thread\n" );
+ intf_ErrMsg( "vout error: unauthorized changes in the vout thread" );
return( 1 );
}
static void SetPalette ( p_vout_thread_t p_vout, u16 *red,
u16 *green, u16 *blue, u16 *transp )
{
- intf_ErrMsg( "SetPalette: method does not support palette changing\n" );
+ intf_ErrMsg( "vout error: method does not support palette changing" );
}