/*****************************************************************************
* Preamble
*****************************************************************************/
-#include <stdlib.h> /* free() */
-#include <stdio.h> /* sprintf() */
-#include <string.h> /* strerror() */
-#include <vlc/vlc.h>
-
-#include "vlc_video.h"
-#include "video_output.h"
-#include "vlc_spu.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <vlc_common.h>
+#include <vlc_vout.h>
+#include <vlc_osd.h>
+#include <vlc_filter.h>
#include "vout_pictures.h"
+#include <assert.h>
+
/**
* Display a picture
*
* threads.
*/
picture_t *vout_CreatePicture( vout_thread_t *p_vout,
- vlc_bool_t b_progressive,
- vlc_bool_t b_top_field_first,
+ bool b_progressive,
+ bool b_top_field_first,
unsigned int i_nb_fields )
{
int i_pic; /* picture index */
{
vlc_mutex_lock( &p_vout->picture_lock );
-#ifdef DEBUG
+#ifndef NDEBUG
/* Check if picture status is valid */
if( (p_pic->i_status != RESERVED_PICTURE) &&
(p_pic->i_status != RESERVED_DATED_PICTURE) &&
vlc_mutex_lock( &p_vout->picture_lock );
p_pic->i_refcount--;
- if( p_pic->i_refcount < 0 )
- {
- msg_Err( p_vout, "picture %p refcount is %i",
- p_pic, p_pic->i_refcount );
- p_pic->i_refcount = 0;
- }
-
if( ( p_pic->i_refcount == 0 ) &&
( p_pic->i_status == DISPLAYED_PICTURE ) )
{
p_vout->fmt_out.i_aspect );
p_tmp_pic->i_type = MEMORY_PICTURE;
p_tmp_pic->i_status = RESERVED_PICTURE;
+ /* some modules (such as blend) needs to know the extra information in picture heap */
+ p_tmp_pic->p_heap = &p_vout->output;
}
/* 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,
case FOURCC_YUY2:
case FOURCC_UYVY:
case FOURCC_J422:
- p_format->i_bits_per_pixel = 16;
p_format->i_bits_per_pixel = 16;
break;
case FOURCC_I411:
break;
case FOURCC_RV32:
+ case FOURCC_RGBA:
p_format->i_bits_per_pixel = 32;
break;
case FOURCC_RV24:
case FOURCC_RGB2:
p_format->i_bits_per_pixel = 8;
break;
+
+ case FOURCC_GREY:
+ case FOURCC_Y800:
+ case FOURCC_Y8:
+ p_format->i_bits_per_pixel = 8;
+ break;
+
default:
p_format->i_bits_per_pixel = 0;
break;
break;
case FOURCC_RV32:
+ case FOURCC_RGBA:
p_pic->p->i_lines = i_height_aligned;
p_pic->p->i_visible_lines = i_height;
p_pic->p->i_pitch = i_width_aligned * 4;
p_pic->i_planes = 1;
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;
+ p_pic->p->i_visible_pitch = i_width;
+ p_pic->p->i_pixel_pitch = 1;
+ p_pic->i_planes = 1;
+ break;
+
default:
msg_Err( p_this, "unknown chroma type 0x%.8x (%4.4s)",
i_chroma, (char*)&i_chroma );
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 );
int i;
for( i = 0; i < p_src->i_planes ; i++ )
if( p_src->p[i].i_pitch == p_dest->p[i].i_pitch )
{
/* There are margins, but with the same width : perfect ! */
- p_this->p_libvlc->pf_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_dest->p[i].p_pixels, p_src->p[i].p_pixels,
+ p_src->p[i].i_pitch * p_src->p[i].i_visible_lines );
}
else
{
/* We need to proceed line by line */
uint8_t *p_in = p_src->p[i].p_pixels;
+ 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--; )
{
- p_this->p_libvlc->pf_memcpy( p_out, p_in,
- p_src->p[i].i_visible_pitch );
+ vlc_memcpy( p_out, p_in, p_src->p[i].i_visible_pitch );
p_in += p_src->p[i].i_pitch;
p_out += p_dest->p[i].i_pitch;
}