# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
#include <vlc_vout.h>
#include <vlc_osd.h>
+#include <vlc_filter.h>
#include "vout_pictures.h"
#include <assert.h>
* It needs locking since several pictures can be created by several producers
* threads.
*/
+int vout_CountPictureAvailable( vout_thread_t *p_vout )
+{
+ int i_free = 0;
+ int i_pic;
+
+ vlc_mutex_lock( &p_vout->picture_lock );
+ for( i_pic = 0; i_pic < I_RENDERPICTURES; i_pic++ )
+ {
+ picture_t *p_pic = PP_RENDERPICTURE[(p_vout->render.i_last_used_pic + i_pic + 1) % I_RENDERPICTURES];
+
+ switch( p_pic->i_status )
+ {
+ case DESTROYED_PICTURE:
+ i_free++;
+ break;
+
+ case FREE_PICTURE:
+ i_free++;
+ break;
+
+ default:
+ break;
+ }
+ }
+ vlc_mutex_unlock( &p_vout->picture_lock );
+
+ return i_free;
+}
+
picture_t *vout_CreatePicture( vout_thread_t *p_vout,
bool b_progressive,
bool b_top_field_first,
}
/* Convert image to the first direct buffer */
- p_vout->chroma.pf_convert( p_vout, p_pic, p_tmp_pic );
+ p_vout->p_chroma->p_owner = (filter_owner_sys_t *)p_tmp_pic;
+ 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,
return NULL;
/* Convert image to the first direct buffer */
- p_vout->chroma.pf_convert( p_vout, p_pic, &p_vout->p_picture[0] );
+ 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,
break;
case FOURCC_GREY:
+ case FOURCC_Y800:
+ case FOURCC_Y8:
p_format->i_bits_per_pixel = 8;
break;
break;
case FOURCC_GREY:
+ case FOURCC_Y800:
+ case FOURCC_Y8:
p_pic->p->i_lines = i_height_aligned;
p_pic->p->i_visible_lines = i_height;
p_pic->p->i_pitch = i_width_aligned;
break;
default:
- msg_Err( p_this, "unknown chroma type 0x%.8x (%4.4s)",
- i_chroma, (char*)&i_chroma );
+ if( p_this )
+ msg_Err( p_this, "unknown chroma type 0x%.8x (%4.4s)",
+ i_chroma, (char*)&i_chroma );
p_pic->i_planes = 0;
return VLC_EGENERIC;
}
return 0;
}
+ case FOURCC_GREY:
+ case FOURCC_Y800:
+ case FOURCC_Y8:
+ switch( i_amorhc )
+ {
+ case FOURCC_GREY:
+ case FOURCC_Y800:
+ case FOURCC_Y8:
+ return 1;
+
+ default:
+ return 0;
+ }
+
default:
return 0;
}
*****************************************************************************/
void __vout_CopyPicture( vlc_object_t *p_this,
picture_t *p_dest, picture_t *p_src )
+{
+ VLC_UNUSED(p_this);
+ picture_Copy( p_dest, p_src );
+}
+
+/*****************************************************************************
+ *
+ *****************************************************************************/
+static void PictureReleaseCallback( picture_t *p_picture )
+{
+ if( --p_picture->i_refcount > 0 )
+ return;
+ picture_Delete( p_picture );
+}
+/*****************************************************************************
+ *
+ *****************************************************************************/
+picture_t *picture_New( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_aspect )
+{
+ picture_t *p_picture = malloc( sizeof(*p_picture) );
+
+ if( !p_picture )
+ return NULL;
+
+ memset( p_picture, 0, sizeof(*p_picture) );
+ if( __vout_AllocatePicture( NULL, p_picture,
+ i_chroma, i_width, i_height, i_aspect ) )
+ {
+ free( p_picture );
+ return NULL;
+ }
+
+ p_picture->i_refcount = 1;
+ p_picture->pf_release = PictureReleaseCallback;
+ p_picture->i_status = RESERVED_PICTURE;
+
+ return p_picture;
+}
+
+/*****************************************************************************
+ *
+ *****************************************************************************/
+void picture_Delete( picture_t *p_picture )
+{
+ assert( p_picture && p_picture->i_refcount == 0 );
+
+ free( p_picture->p_data_orig );
+ free( p_picture->p_sys );
+ free( p_picture );
+}
+
+/*****************************************************************************
+ *
+ *****************************************************************************/
+void picture_CopyPixels( picture_t *p_dst, const picture_t *p_src )
{
int i;
for( i = 0; i < p_src->i_planes ; i++ )
{
- if( p_src->p[i].i_pitch == p_dest->p[i].i_pitch )
+ const unsigned i_width = __MIN( p_dst->p[i].i_visible_pitch,
+ p_src->p[i].i_visible_pitch );
+ const unsigned i_height = __MIN( p_dst->p[i].i_visible_lines,
+ p_src->p[i].i_visible_lines );
+
+ if( p_src->p[i].i_pitch == p_dst->p[i].i_pitch )
{
/* There are margins, but with the same width : perfect ! */
- vlc_memcpy( p_dest->p[i].p_pixels, p_src->p[i].p_pixels,
- p_src->p[i].i_pitch * p_src->p[i].i_visible_lines );
+ vlc_memcpy( p_dst->p[i].p_pixels, p_src->p[i].p_pixels,
+ p_src->p[i].i_pitch * i_height );
}
else
{
/* We need to proceed line by line */
uint8_t *p_in = p_src->p[i].p_pixels;
+ uint8_t *p_out = p_dst->p[i].p_pixels;
+ int i_line;
+
assert( p_in );
- uint8_t *p_out = p_dest->p[i].p_pixels;
assert( p_out );
- int i_line;
- for( i_line = p_src->p[i].i_visible_lines; i_line--; )
+ for( i_line = i_height; i_line--; )
{
- vlc_memcpy( p_out, p_in, p_src->p[i].i_visible_pitch );
+ vlc_memcpy( p_out, p_in, i_width );
p_in += p_src->p[i].i_pitch;
- p_out += p_dest->p[i].i_pitch;
+ p_out += p_dst->p[i].i_pitch;
}
}
}
-
- p_dest->date = p_src->date;
- p_dest->b_force = p_src->b_force;
- p_dest->i_nb_fields = p_src->i_nb_fields;
- p_dest->b_progressive = p_src->b_progressive;
- p_dest->b_top_field_first = p_src->b_top_field_first;
}
+
+/*****************************************************************************
+ *
+ *****************************************************************************/
+
+