[Mplayer-cvslog] CVS: main/libvo vo_dxr3.c,1.88,1.89
David Holm
david at realityrift.com
Thu Jul 18 16:05:25 CEST 2002
Reverse this before releasing 0.90, it breaks dxr3 support in many
ways!!
I don't want to have the same mess I had with 0.60
//David
On Fri, 2002-07-05 at 14:26, Alex Beregszaszi wrote:
> Update of /cvsroot/mplayer/main/libvo
> In directory mail:/var/tmp.root/cvs-serv25638
>
> Modified Files:
> vo_dxr3.c
> Log Message:
> removed fame and lavc encoder, enabled spu encoder, added equaliuzer support
>
> Index: vo_dxr3.c
> ===================================================================
> RCS file: /cvsroot/mplayer/main/libvo/vo_dxr3.c,v
> retrieving revision 1.88
> retrieving revision 1.89
> diff -u -r1.88 -r1.89
> --- vo_dxr3.c 2 Jul 2002 13:32:08 -0000 1.88
> +++ vo_dxr3.c 5 Jul 2002 14:26:37 -0000 1.89
> @@ -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,64 +94,20 @@
> #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
> -
> -/* 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
> +#include "../vidix/vidixlib.h"
>
> -/* 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
> +#define SPU_SUPPORT
>
> -char *picture_data[] = { NULL, NULL, NULL };
> -int picture_linesize[] = { 0, 0, 0 };
> -
> -#ifdef HAVE_MMX
> -#include "mmx.h"
> -#endif
> -
> -LIBVO_EXTERN (dxr3)
> -
> -/* codec control */
> -enum MpegCodec {
> - MPG_CODEC_NON,
> - MPG_CODEC_AVCODEC,
> - MPG_CODEC_FAME
> +static vo_info_t vo_info =
> +{
> + "DXR3/H+ video out",
> + "dxr3",
> + "David Holm <dholm at iname.com>",
> + ""
> };
> -
> -#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
> +LIBVO_EXTERN (dxr3)
>
> /* Resolutions and positions */
> static int v_width, v_height;
> @@ -155,7 +115,6 @@
> 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 at 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;
> -#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;
> +#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
>
> - 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]);
> -#endif
> + }
> }
> + 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;
> -#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;
> + write(fd_spu, p->data, p->size);
> + } else
> #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;
> }
>
> _______________________________________________
> Mplayer-cvslog mailing list
> Mplayer-cvslog at mplayerhq.hu
> http://mplayerhq.hu/mailman/listinfo/mplayer-cvslog
More information about the MPlayer-cvslog
mailing list