Mercurial > mplayer.hg
changeset 6647:c66284733f3d
removed fame and lavc encoder, enabled spu encoder, added equaliuzer support
author | alex |
---|---|
date | Fri, 05 Jul 2002 14:26:37 +0000 |
parents | 6cfc8fd31299 |
children | 55e3129208fc |
files | libvo/vo_dxr3.c |
diffstat | 1 files changed, 110 insertions(+), 365 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/vo_dxr3.c Fri Jul 05 02:51:19 2002 +0000 +++ b/libvo/vo_dxr3.c Fri Jul 05 14:26:37 2002 +0000 @@ -6,6 +6,10 @@ */ /* ChangeLog added 2002-01-10 + * 2002-07-05: + * Removed lavc and fame encoder to be compatible with new libvo style. + * Added graphic equalizer support. + * * 2002-04-15: * The spuenc code isn't 100% stable yet, therefore I'm disabling * it due to the upcoming stable release. @@ -90,72 +94,27 @@ #include "video_out.h" #include "video_out_internal.h" #include "aspect.h" -#include "postproc/rgb2rgb.h" -#include "postproc/swscale.h" #include "cpudetect.h" #include "spuenc.h" - -//#define USE_LIBFAME // this is done in configure now +#include "../vidix/vidixlib.h" -/* Libfame codec initialisation */ -#ifdef USE_LIBFAME -#include "../libfame/fame.h" -static unsigned char *outbuf = NULL; -static fame_parameters_t fame_params; -static fame_yuv_t fame_yuv; -static fame_context_t *fame_ctx = NULL; -static fame_object_t *fame_obj; -#endif +#define SPU_SUPPORT -/* libavcodec codec initialisation */ -#ifdef USE_LIBAVCODEC -#ifdef USE_LIBAVCODEC_SO -#include <libffmpeg/avcodec.h> -#include <libffmpeg/dsputil.h> -#else -#include "libavcodec/avcodec.h" -#include "libavcodec/dsputil.h" -#endif -/* for video encoder */ -static AVCodec *avc_codec = NULL; -static AVCodecContext *avc_context = NULL; -static AVPicture avc_picture; -int avc_outbuf_size = 100000; -extern int avcodec_inited; -extern int motion_estimation_method; -#endif - -char *picture_data[] = { NULL, NULL, NULL }; -int picture_linesize[] = { 0, 0, 0 }; - -#ifdef HAVE_MMX -#include "mmx.h" -#endif - +static vo_info_t vo_info = +{ + "DXR3/H+ video out", + "dxr3", + "David Holm <dholm@iname.com>", + "" +}; LIBVO_EXTERN (dxr3) -/* codec control */ -enum MpegCodec { - MPG_CODEC_NON, - MPG_CODEC_AVCODEC, - MPG_CODEC_FAME -}; - -#if defined(USE_LIBAVCODEC) -static int mpeg_codec = MPG_CODEC_AVCODEC; -#elif defined(USE_LIBFAME) -static int mpeg_codec = MPG_CODEC_FAME; -#else -static int mpeg_codec = MPG_CODEC_NONE; -#endif - /* Resolutions and positions */ static int v_width, v_height; static int s_width, s_height; static int osd_w, osd_h; static int noprebuf = 0; static int img_format = 0; -static SwsContext * sws = NULL; /* File descriptors */ static int fd_control = -1; @@ -164,27 +123,23 @@ static char fdv_name[80]; static char fds_name[80]; +#ifdef SPU_SUPPORT /* on screen display/subpics */ static char *osdpicbuf = NULL; static int osdpicbuf_w; static int osdpicbuf_h; static int disposd = 0; static encodedata *spued; +#endif /* Static variable used in ioctl's */ static int ioval = 0; -static vo_info_t vo_info = -{ - "DXR3/H+ video out", - "dxr3", - "David Holm <dholm@iname.com>", - "" -}; +static int get_video_eq(vidix_video_eq_t *info); +static int set_video_eq(vidix_video_eq_t *info); uint32_t control(uint32_t request, void *data, ...) { - uint32_t flag = 0; switch (request) { case VOCTRL_RESUME: if (!noprebuf) { @@ -213,29 +168,26 @@ } return VO_TRUE; case VOCTRL_QUERY_FORMAT: - switch (*((uint32_t*)data)) { - case IMGFMT_MPEGPES: - /* Hardware accelerated | Hardware supports subpics */ - flag = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_SPU; - break; -#if defined(USE_LIBFAME) || defined(USE_LIBAVCODEC) - case IMGFMT_YV12: - case IMGFMT_YUY2: - case IMGFMT_RGB24: - case IMGFMT_BGR24: - /* Conversion needed | OSD Supported */ - flag = VFCAP_CSP_SUPPORTED | VFCAP_OSD; - break; -#else - default: - printf("VO: [dxr3] You have disabled libavcodec/libfame support (Read DOCS/codecs.html)!\n"); -#endif - } - if (noprebuf) { - return flag; - } else { - return (flag | VFCAP_TIMER); - } + { + uint32_t flag = 0; + + if (*((uint32_t*)data) != IMGFMT_MPEGPES) + return 0; + + flag = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_SPU; + if (!noprebuf) + flag |= VFCAP_TIMER; + return flag; + } + case VOCTRL_QUERY_VAA: + { + vo_vaa_t *vaa = data; + + memset(vaa,0,sizeof(vo_vaa_t)); + vaa->get_video_eq=get_video_eq; + vaa->set_video_eq=set_video_eq; + return VO_TRUE; + } } return VO_NOTIMPL; } @@ -324,160 +276,25 @@ printf("VO: [dxr3] Setting aspect ratio to 16:9\n"); } ioctl(fd_control, EM8300_IOCTL_SET_ASPECTRATIO, &ioval); - - if (format != IMGFMT_MPEGPES) { - size = s_width * s_height; - picture_data[0] = malloc((size * 3) / 2); - picture_data[1] = picture_data[0] + size; - picture_data[2] = picture_data[1] + size / 4; - - picture_linesize[0] = s_width; - picture_linesize[1] = s_width / 2; - picture_linesize[2] = s_width / 2; - switch (mpeg_codec) { -#ifdef USE_LIBFAME - case MPG_CODEC_FAME: - printf("VO: [dxr3] Using FAME\n"); - fame_ctx = fame_open(); - if (!fame_ctx) { - printf("VO: [dxr3] Cannot open libFAME!\n"); - return -1; - } - fame_obj = fame_get_object(fame_ctx, "motion/pmvfast"); - fame_register(fame_ctx, "motion", fame_obj); - - memset(&fame_params, 0, sizeof(fame_parameters_t)); - fame_params.width = s_width; - fame_params.height = s_height; - fame_params.coding = "IPPPPPPP"; - fame_params.quality = 90; - fame_params.bitrate = 0; - fame_params.slices_per_frame = 1; - fame_params.frames_per_sequence = (int) (vo_fps + 0.5); - fame_params.shape_quality = 100; - fame_params.search_range = (int) (vo_fps + 0.5); - fame_params.verbose = 0; - fame_params.profile = NULL; - - if (vo_fps < 24.0) { - fame_params.frame_rate_num = 24000; - fame_params.frame_rate_den = 1001; - } else if (vo_fps < 25.0) { - fame_params.frame_rate_num = 24; - fame_params.frame_rate_den = 1; - } else if (vo_fps < 29.0) { - fame_params.frame_rate_num = 25; - fame_params.frame_rate_den = 1; - } else if (vo_fps < 30.0) { - fame_params.frame_rate_num = 30000; - fame_params.frame_rate_den = 1001; - } else if (vo_fps < 50.0) { - fame_params.frame_rate_num = 30; - fame_params.frame_rate_den = 1; - } else if (vo_fps < 55.0) { - fame_params.frame_rate_num = 50; - fame_params.frame_rate_den = 1; - } else if (vo_fps < 60.0) { - fame_params.frame_rate_num = 60000; - fame_params.frame_rate_den = 1001; - } else { - fame_params.frame_rate_num = 60; - fame_params.frame_rate_den = 1; - } - - outbuf = malloc(100000); - fame_init(fame_ctx, &fame_params, outbuf, 100000); - - fame_yuv.w = s_width; - fame_yuv.h = s_height; - fame_yuv.y = picture_data[0]; - fame_yuv.u = picture_data[1]; - fame_yuv.v = picture_data[2]; - break; +#ifdef SPU_SUPPORT + osdpicbuf = malloc(s_width * s_height); + if (osdpicbuf == NULL) { + printf("vo_dxr3: out of mem\n"); + return -1; + } + spued = (encodedata *) malloc(sizeof(encodedata)); + if (spued == NULL) { + printf("vo_dxr3:out of mem\n"); + return -1; + } + osd_w = s_width; + osd_h = s_height; + osdpicbuf_w = s_width; + osdpicbuf_h = s_height; #endif -#ifdef USE_LIBAVCODEC - case MPG_CODEC_AVCODEC: - printf("VO: [dxr3] Using AVCODEC\n"); - avc_codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO); - if (!avc_codec) { - printf("VO: [dxr3] Unable to find mpeg1video codec\n"); - uninit(); - return -1; - } - if (avc_context) { - free(avc_context); - } - avc_context = malloc(sizeof(AVCodecContext)); - memset(avc_context, 0, sizeof(AVCodecContext)); - avc_context->width = s_width; - avc_context->height = s_height; -// realy need this line ? -- Pontscho -// ioctl(fd_control, EM8300_IOCTL_GET_VIDEOMODE, &ioval); - avc_context->gop_size = 7; - avc_context->frame_rate = (int) (vo_fps * FRAME_RATE_BASE); - avc_context->bit_rate = 0; - avc_context->flags = CODEC_FLAG_QSCALE; - avc_context->quality = 2; - avc_context->pix_fmt = PIX_FMT_YUV420P; - motion_estimation_method = ME_EPZS; - if (avcodec_open(avc_context, avc_codec) < 0) { - printf("VO: [dxr3] Unable to open codec\n"); - uninit(); - return -1; - } - /* Create a pixel buffer and set up pointers for color components */ - memset(&avc_picture, 0, sizeof(avc_picture)); - avc_picture.linesize[0] = picture_linesize[0]; - avc_picture.linesize[1] = picture_linesize[1]; - avc_picture.linesize[2] = picture_linesize[2]; - - avc_picture.data[0] = picture_data[0]; - avc_picture.data[1] = picture_data[1]; - avc_picture.data[2] = picture_data[2]; - break; -#endif - } - sws = getSwsContextFromCmdLine(v_width, v_height, img_format, s_width, s_height, IMGFMT_YV12); - if (!sws) { - printf("vo_vesa: Can't initialize SwScaler\n"); - return -1; - } - - /* This stuff calculations the relative position of the osd */ - osd_w = s_width; - osd_h = s_height; - - if (format == IMGFMT_BGR24) { - yuv2rgb_init(24, MODE_BGR); - } else { - yuv2rgb_init(24, MODE_RGB); - } - return 0; - } else if (format == IMGFMT_MPEGPES) { - printf("VO: [dxr3] Format: MPEG-PES (no conversion needed)\n"); - osdpicbuf = malloc(s_width * s_height); - if (osdpicbuf == NULL) { - printf("vo_dxr3: out of mem\n"); - return -1; - } - spued = (encodedata *) malloc(sizeof(encodedata)); - if (spued == NULL) { - printf("vo_dxr3:out of mem\n"); - return -1; - } - osd_w = s_width; - osd_h = s_height; - osdpicbuf_w = s_width; - osdpicbuf_h = s_height; - - return 0; - } - - printf("VO: [dxr3] Format: Unsupported\n"); - uninit(); - return -1; + return 0; } static const vo_info_t* get_info(void) @@ -487,46 +304,40 @@ static void draw_alpha(int x, int y, int w, int h, unsigned char* src, unsigned char *srca, int srcstride) { - /*int lx, ly, bx; - unsigned char *buf; - buf = &osdpicbuf[(y * osdpicbuf_w) + x]; - if (img_format == IMGFMT_MPEGPES) { - for (ly = 0; ly < h - 1; ly++) { - for(lx = 0; lx < w; lx++) { - if ((srca[(ly * srcstride) + lx] != 0) && (src[(ly * srcstride) + lx] != 0)) { - if(src[(ly * srcstride) + lx] >= 128) { - buf[ly * osdpicbuf_w + lx] = 3; - } +#ifdef SPU_SUPPORT + int lx, ly, bx; + unsigned char *buf = &osdpicbuf[(y * osdpicbuf_w) + x]; + for (ly = 0; ly < h - 1; ly++) { + for(lx = 0; lx < w; lx++) { + if ((srca[(ly * srcstride) + lx] != 0) && (src[(ly * srcstride) + lx] != 0)) { + if(src[(ly * srcstride) + lx] >= 128) { + buf[ly * osdpicbuf_w + lx] = 3; } } - } - pixbuf_encode_rle(x, y, osdpicbuf_w, osdpicbuf_h - 1, osdpicbuf, osdpicbuf_w, spued); - } else*/ { -#if defined(USE_LIBAVCODEC) || defined(USE_LIBFAME) - vo_draw_alpha_yv12(w, h, src, srca, srcstride, - picture_data[0] + x + y * picture_linesize[0], picture_linesize[0]); + } + } + pixbuf_encode_rle(x, y, osdpicbuf_w, osdpicbuf_h - 1, osdpicbuf, osdpicbuf_w, spued); #endif - } } static void draw_osd(void) { - if (img_format != IMGFMT_MPEGPES) { - vo_draw_text(osd_w, osd_h, draw_alpha); - } /*else if ((disposd % 15) == 0) { +#ifdef SPU_SUPPORT + if ((disposd % 15) == 0) { vo_draw_text(osd_w, osd_h, draw_alpha); memset(osdpicbuf, 0, s_width * s_height); -*/ + /* could stand some check here to see if the subpic hasn't changed * as if it hasn't and we re-send it it will "blink" as the last one * is turned off, and the new one (same one) is turned on */ - /*if (!noprebuf) { + if (!noprebuf) { ioctl(fd_spu, EM8300_IOCTL_SPU_SETPTS, &vo_pts); } write(fd_spu, spued->data, spued->count); } - disposd++;*/ + disposd++; +#endif } @@ -534,39 +345,18 @@ { char *pData; int pSize; - if (img_format == IMGFMT_MPEGPES) { - vo_mpegpes_t *p = (vo_mpegpes_t *) src[0]; + vo_mpegpes_t *p = (vo_mpegpes_t *) src[0]; - if (p->id == 0x20) { - if (!noprebuf) { - ioctl(fd_spu, EM8300_IOCTL_SPU_SETPTS, &vo_pts); - } - write(fd_spu, p->data, p->size); - } else { - write(fd_video, p->data, p->size); +#ifdef SPU_SUPPORT + if (p->id == 0x20) { + if (!noprebuf) { + ioctl(fd_spu, EM8300_IOCTL_SPU_SETPTS, &vo_pts); } - return 0; - } else { - int size, srcStride = (img_format == IMGFMT_YUY2) ? (v_width * 2) : (v_width * 3); - sws->swScale(sws, src, &srcStride, 0, v_height, picture_data, picture_linesize); - draw_osd(); - switch (mpeg_codec) { -#ifdef USE_LIBFAME - case MPG_CODEC_FAME: - size = fame_encode_frame(fame_ctx, &fame_yuv, NULL); - write(fd_video, outbuf, size); - break; + write(fd_spu, p->data, p->size); + } else #endif -#ifdef USE_LIBAVCODEC - case MPG_CODEC_AVCODEC: - size = avcodec_encode_video(avc_context, picture_data[0], avc_outbuf_size, &avc_picture); - write(fd_video, picture_data[0], size); - break; -#endif - } - return 0; - } - return -1; + write(fd_video, p->data, p->size); + return 0; } static void flip_page(void) @@ -575,62 +365,16 @@ if (!noprebuf) { ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts); } - if (img_format == IMGFMT_YV12) { - switch (mpeg_codec) { -#ifdef USE_LIBFAME - case MPG_CODEC_FAME: - size = fame_encode_frame(fame_ctx, &fame_yuv, NULL); - write(fd_video, outbuf, size); - break; -#endif -#ifdef USE_LIBAVCODEC - case MPG_CODEC_AVCODEC: - size = avcodec_encode_video(avc_context, picture_data[0], avc_outbuf_size, &avc_picture); - if (!noprebuf) { - ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts); - } - write(fd_video, picture_data[0], size); - break; -#endif - } - } } static uint32_t draw_slice(uint8_t *srcimg[], int stride[], int w, int h, int x0, int y0) { - if (img_format == IMGFMT_YV12) { - sws->swScale(sws, srcimg, stride, y0, h, picture_data, picture_linesize); - return 0; - } return -1; } static void uninit(void) { printf("VO: [dxr3] Uninitializing\n"); - if (sws) { - freeSwsContext(sws); - } - - switch (mpeg_codec) { -#ifdef USE_LIBFAME - case MPG_CODEC_FAME: - if (fame_ctx) { - fame_close(fame_ctx); - } - break; -#endif -#ifdef USE_LIBAVCODEC - case MPG_CODEC_AVCODEC: - if (avc_context) { - avcodec_close(avc_context); - } - break; -#endif - } - if (picture_data[0]) { - free(picture_data[0]); - } if (fd_video) { close(fd_video); } @@ -640,12 +384,14 @@ if (fd_control) { close(fd_control); } +#ifdef SPU_SUPPORT if(osdpicbuf) { free(osdpicbuf); } if(spued) { free(spued); } +#endif } static void check_events(void) @@ -676,27 +422,6 @@ fdflags |= O_NONBLOCK; } -#if defined(USE_LIBFAME) - printf("VO: [dxr3] FAME supported\n"); - if (arg && !strncmp("fame", arg, 4)) { - mpeg_codec = MPG_CODEC_FAME; - arg = strchr(arg, ':'); - if (arg) { - arg++; - } - } -#endif -#if defined(USE_LIBAVCODEC) - printf("VO: [dxr3] AVCODEC supported\n"); - if (arg && !strncmp("avcodec", arg, 7)) { - mpeg_codec = MPG_CODEC_AVCODEC; - arg = strchr(arg, ':'); - if (arg) { - arg++; - } - } -#endif - if (arg && arg[0]) { printf("VO: [dxr3] Forcing use of device %s\n", arg); sprintf(devname, "/dev/em8300-%s", arg); @@ -760,15 +485,35 @@ } } strcpy(fds_name, devname); - -#if defined(USE_LIBAVCODEC) - if (mpeg_codec == MPG_CODEC_AVCODEC && !avcodec_inited) { - avcodec_init(); - avcodec_register_all(); - avcodec_inited = 1; - } - -#endif return 0; } + +static int get_video_eq(vidix_video_eq_t *info) +{ + em8300_bcs_t bcs; + + if (ioctl(fd_control, EM8300_IOCTL_GETBCS, &bcs) < 0) + return 1; + info->brightness = bcs.brightness; + info->contrast = bcs.contrast; + info->saturation = bcs.saturation; + info->cap = VEQ_CAP_BRIGHTNESS|VEQ_CAP_CONTRAST|VEQ_CAP_SATURATION; + return 0; +} + +static int set_video_eq(vidix_video_eq_t *info) +{ + em8300_bcs_t bcs; + + if (info->cap & VEQ_CAP_BRIGHTNESS) + bcs.brightness = info->brightness; + if (info->cap & VEQ_CAP_CONTRAST) + bcs.contrast = info->contrast; + if (info->cap & VEQ_CAP_SATURATION) + bcs.saturation = info->saturation; + + if (ioctl(fd_control, EM8300_IOCTL_SETBCS, &bcs) < 0) + return 1; + return 0; +}