www.pudn.com > mpeg2win-0.4-source.zip > video_out_null.c


/*  
 * video_out_null.c 
 * Copyright (C) 1999-2001 Aaron Holtzman  
 * 
 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. 
 * 
 * mpeg2dec is free software; you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation; either version 2 of the License, or 
 * (at your option) any later version. 
 * 
 * mpeg2dec is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * GNU General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */ 
 
#include "config.h" 
 
#include  
#include  
 
#include "video_out.h" 
#include "video_out_internal.h" 
#include "yuv2rgb.h" 
 
typedef struct null_frame_s { 
    vo_frame_t vo; 
    uint8_t * rgb_ptr; 
    int rgb_stride; 
    int yuv_stride; 
} null_frame_t; 
 
typedef struct null_instance_s { 
    vo_instance_t vo; 
    int prediction_index; 
    vo_frame_t * frame_ptr[3]; 
    null_frame_t frame[3]; 
    uint8_t * rgbdata; 
    int rgbstride; 
    int width; 
    int bpp; 
} null_instance_t; 
 
static void null_draw_frame (vo_frame_t * frame) 
{ 
} 
 
static int null_setup (vo_instance_t * instance, int width, int height) 
{ 
    return libvo_common_alloc_frames (instance, width, height, 
				      sizeof (null_frame_t), 
				      NULL, NULL, null_draw_frame); 
} 
 
vo_instance_t * vo_null_open (void) 
{ 
    null_instance_t * instance; 
 
    instance = malloc (sizeof (null_instance_t)); 
    if (instance == NULL) 
	return NULL; 
 
    instance->vo.setup = null_setup; 
    instance->vo.close = libvo_common_free_frames; 
    instance->vo.get_frame = libvo_common_get_frame; 
 
    return (vo_instance_t *) instance; 
} 
 
static void null_copy_slice (vo_frame_t * frame, uint8_t ** src) 
{ 
} 
 
static int nullslice_setup (vo_instance_t * instance, int width, int height) 
{ 
    return libvo_common_alloc_frames (instance, width, height, 
				      sizeof (null_frame_t), 
				      null_copy_slice, NULL, null_draw_frame); 
} 
 
vo_instance_t * vo_nullslice_open (void) 
{ 
    null_instance_t * instance; 
 
    instance = malloc (sizeof (null_instance_t)); 
    if (instance == NULL) 
	return NULL; 
 
    instance->vo.setup = nullslice_setup; 
    instance->vo.close = libvo_common_free_frames; 
    instance->vo.get_frame = libvo_common_get_frame; 
 
    return (vo_instance_t *) instance; 
} 
 
static vo_frame_t * rgb_get_frame (vo_instance_t * _instance, int flags) 
{ 
    null_instance_t * instance; 
    null_frame_t * frame; 
 
    instance = (null_instance_t *) _instance; 
    frame = 
	(null_frame_t *) libvo_common_get_frame ((vo_instance_t *) instance, 
						 flags); 
 
    frame->rgb_ptr = instance->rgbdata; 
    frame->rgb_stride = instance->rgbstride; 
    frame->yuv_stride = instance->width; 
    if ((flags & VO_TOP_FIELD) == 0) 
        frame->rgb_ptr += frame->rgb_stride; 
    if ((flags & VO_BOTH_FIELDS) != VO_BOTH_FIELDS) { 
        frame->rgb_stride <<= 1; 
        frame->yuv_stride <<= 1; 
    } 
 
    return (vo_frame_t *) frame; 
} 
 
static void rgb_copy_slice (vo_frame_t * _frame, uint8_t ** src) 
{ 
    null_frame_t * frame; 
    null_instance_t * instance; 
 
    frame = (null_frame_t *) _frame; 
    instance = (null_instance_t *) frame->vo.instance; 
 
    yuv2rgb (frame->rgb_ptr, src[0], src[1], src[2], instance->width, 16, 
	     frame->rgb_stride, frame->yuv_stride, frame->yuv_stride >> 1); 
    frame->rgb_ptr += frame->rgb_stride << 4; 
} 
 
static void rgb_field (vo_frame_t * _frame, int flags) 
{ 
    null_frame_t * frame; 
    null_instance_t * instance; 
 
    frame = (null_frame_t *) _frame; 
    instance = (null_instance_t *) frame->vo.instance; 
 
    frame->rgb_ptr = instance->rgbdata; 
    if ((flags & VO_TOP_FIELD) == 0) 
	frame->rgb_ptr += instance->rgbstride; 
} 
 
static int nullrgb_setup (vo_instance_t * _instance, int width, int height) 
{ 
    null_instance_t * instance; 
 
    instance = (null_instance_t *) _instance; 
 
    instance->width = width; 
    instance->rgbstride = width * instance->bpp / 8; 
    instance->rgbdata = malloc (instance->rgbstride * height); 
 
    yuv2rgb_init (instance->bpp, MODE_RGB); 
 
    return libvo_common_alloc_frames ((vo_instance_t *) instance, 
				      width, height, sizeof (null_frame_t), 
				      rgb_copy_slice, rgb_field, 
				      null_draw_frame); 
} 
 
vo_instance_t * vo_nullrgb16_open (void) 
{ 
    null_instance_t * instance; 
 
    instance = malloc (sizeof (null_instance_t)); 
    if (instance == NULL) 
	return NULL; 
 
    instance->vo.setup = nullrgb_setup; 
    instance->vo.close = libvo_common_free_frames; 
    instance->vo.get_frame = rgb_get_frame; 
    instance->bpp = 16; 
 
    return (vo_instance_t *) instance; 
} 
 
vo_instance_t * vo_nullrgb32_open (void) 
{ 
    null_instance_t * instance; 
 
    instance = malloc (sizeof (null_instance_t)); 
    if (instance == NULL) 
	return NULL; 
 
    instance->vo.setup = nullrgb_setup; 
    instance->vo.close = libvo_common_free_frames; 
    instance->vo.get_frame = rgb_get_frame; 
    instance->bpp = 32; 
 
    return (vo_instance_t *) instance; 
}