p_pic->i_status = DESTROYED_PICTURE;
p_vout->i_heap_size--;
+ picture_CleanupQuant( p_pic );
vlc_mutex_unlock( &p_vout->picture_lock );
}
{
p_pic->i_status = DESTROYED_PICTURE;
p_vout->i_heap_size--;
+ picture_CleanupQuant( p_pic );
}
vlc_mutex_unlock( &p_vout->picture_lock );
}
+static int vout_LockPicture( vout_thread_t *p_vout, picture_t *p_picture )
+{
+ if( p_picture->pf_lock )
+ return p_picture->pf_lock( p_vout, p_picture );
+ return VLC_SUCCESS;
+}
+static void vout_UnlockPicture( vout_thread_t *p_vout, picture_t *p_picture )
+{
+ if( p_picture->pf_unlock )
+ p_picture->pf_unlock( p_vout, p_picture );
+}
+
/**
* Render a picture
*
* before rendering, does the subpicture magic, and tells the video output
* thread which direct buffer needs to be displayed.
*/
-picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
- subpicture_t *p_subpic )
+picture_t *vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
+ subpicture_t *p_subpic )
{
- int i_scale_width, i_scale_height;
-
if( p_pic == NULL )
- {
- /* XXX: subtitles */
return NULL;
- }
-
- i_scale_width = p_vout->fmt_out.i_visible_width * 1000 /
- p_vout->fmt_in.i_visible_width;
- i_scale_height = p_vout->fmt_out.i_visible_height * 1000 /
- p_vout->fmt_in.i_visible_height;
if( p_pic->i_type == DIRECT_PICTURE )
{
- if( !p_vout->render.b_allow_modify_pics || p_pic->i_refcount ||
- p_pic->b_force )
+ /* Picture is in a direct buffer. */
+
+ if( p_subpic != NULL )
{
- /* Picture is in a direct buffer and is still in use,
- * we need to copy it to another direct buffer before
- * displaying it if there are subtitles. */
- if( p_subpic != NULL )
- {
- /* We have subtitles. First copy the picture to
- * the spare direct buffer, then render the
- * subtitles. */
- vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
+ /* We have subtitles. First copy the picture to
+ * the spare direct buffer, then render the
+ * subtitles. */
+ if( vout_LockPicture( p_vout, PP_OUTPUTPICTURE[0] ) )
+ return NULL;
- spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
- PP_OUTPUTPICTURE[0], p_pic, p_subpic,
- i_scale_width, i_scale_height );
+ vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
- return PP_OUTPUTPICTURE[0];
- }
+ spu_RenderSubpictures( p_vout->p_spu,
+ PP_OUTPUTPICTURE[0], &p_vout->fmt_out,
+ p_subpic, &p_vout->fmt_in );
- /* No subtitles, picture is in a directbuffer so
- * we can display it directly even if it is still
- * in use. */
- return p_pic;
- }
+ vout_UnlockPicture( p_vout, PP_OUTPUTPICTURE[0] );
- /* Picture is in a direct buffer but isn't used by the
- * decoder. We can safely render subtitles on it and
- * display it. */
- spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, p_pic, p_pic,
- p_subpic, i_scale_width, i_scale_height );
+ return PP_OUTPUTPICTURE[0];
+ }
+ /* No subtitles, picture is in a directbuffer so
+ * we can display it directly (even if it is still
+ * in use or not). */
return p_pic;
}
* same size as the direct buffers. A memcpy() is enough,
* then render the subtitles. */
- if( PP_OUTPUTPICTURE[0]->pf_lock )
- if( PP_OUTPUTPICTURE[0]->pf_lock( p_vout, PP_OUTPUTPICTURE[0] ) )
- return NULL;
+ if( vout_LockPicture( p_vout, PP_OUTPUTPICTURE[0] ) )
+ return NULL;
vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
- spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
- PP_OUTPUTPICTURE[0], p_pic,
- p_subpic, i_scale_width, i_scale_height );
+ spu_RenderSubpictures( p_vout->p_spu,
+ PP_OUTPUTPICTURE[0], &p_vout->fmt_out,
+ p_subpic, &p_vout->fmt_in );
- if( PP_OUTPUTPICTURE[0]->pf_unlock )
- PP_OUTPUTPICTURE[0]->pf_unlock( p_vout, PP_OUTPUTPICTURE[0] );
+ vout_UnlockPicture( p_vout, PP_OUTPUTPICTURE[0] );
return PP_OUTPUTPICTURE[0];
}
p_vout->p_chroma->pf_video_filter( p_vout->p_chroma, p_pic );
/* Render subpictures on the first direct buffer */
- spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, p_tmp_pic,
- p_tmp_pic, p_subpic,
- i_scale_width, i_scale_height );
+ spu_RenderSubpictures( p_vout->p_spu,
+ p_tmp_pic, &p_vout->fmt_out,
+ p_subpic, &p_vout->fmt_in );
- if( p_vout->p_picture[0].pf_lock )
- if( p_vout->p_picture[0].pf_lock( p_vout, &p_vout->p_picture[0] ) )
- return NULL;
+ if( vout_LockPicture( p_vout, &p_vout->p_picture[0] ) )
+ return NULL;
vout_CopyPicture( p_vout, &p_vout->p_picture[0], p_tmp_pic );
}
else
{
- if( p_vout->p_picture[0].pf_lock )
- if( p_vout->p_picture[0].pf_lock( p_vout, &p_vout->p_picture[0] ) )
- return NULL;
+ if( vout_LockPicture( p_vout, &p_vout->p_picture[0] ) )
+ return NULL;
/* Convert image to the first direct buffer */
p_vout->p_chroma->p_owner = (filter_owner_sys_t *)&p_vout->p_picture[0];
p_vout->p_chroma->pf_video_filter( p_vout->p_chroma, p_pic );
/* Render subpictures on the first direct buffer */
- spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
- &p_vout->p_picture[0], &p_vout->p_picture[0],
- p_subpic, i_scale_width, i_scale_height );
+ spu_RenderSubpictures( p_vout->p_spu,
+ &p_vout->p_picture[0], &p_vout->fmt_out,
+ p_subpic, &p_vout->fmt_in );
}
- if( p_vout->p_picture[0].pf_unlock )
- p_vout->p_picture[0].pf_unlock( p_vout, &p_vout->p_picture[0] );
+ vout_UnlockPicture( p_vout, &p_vout->p_picture[0] );
return &p_vout->p_picture[0];
}
case FOURCC_GREY:
case FOURCC_Y800:
case FOURCC_Y8:
+ case FOURCC_RGBP:
p_format->i_bits_per_pixel = 8;
break;
p_pic->p[i_index].i_pixel_pitch = 1;
}
- p_pic->pf_release = 0;
- p_pic->pf_lock = 0;
- p_pic->pf_unlock = 0;
+ p_pic->pf_release = NULL;
+ p_pic->pf_lock = NULL;
+ p_pic->pf_unlock = NULL;
p_pic->i_refcount = 0;
p_pic->p_q = NULL;
case FOURCC_GREY:
case FOURCC_Y800:
case FOURCC_Y8:
+ case FOURCC_RGBP:
p_pic->p->i_lines = i_height_aligned;
p_pic->p->i_visible_lines = i_height;
p_pic->p->i_pitch = i_width_aligned;
{
assert( p_picture && p_picture->i_refcount == 0 );
+ free( p_picture->p_q );
free( p_picture->p_data_orig );
free( p_picture->p_sys );
free( p_picture );
*
*****************************************************************************/
-