[MPlayer-dev-eng] [PATCH] DXR3 SwScaling
David Holm
david at realityrift.com
Sun Feb 10 00:09:45 CET 2002
Here is a new patch which should apply more easily against cvs...
-------------- next part --------------
Index: mplayer.c
===================================================================
RCS file: /cvsroot/mplayer/main/mplayer.c,v
retrieving revision 1.390
diff -u -r1.390 mplayer.c
--- mplayer.c 9 Feb 2002 14:53:49 -0000 1.390
+++ mplayer.c 9 Feb 2002 23:20:57 -0000
@@ -216,6 +216,10 @@
int allow_dshow=0;
#endif
+#ifdef HAVE_DXR3
+float scalefactor=1.0;
+#endif
+
// streaming:
int audio_id=-1;
int video_id=-1;
Index: cfg-mplayer.h
===================================================================
RCS file: /cvsroot/mplayer/main/cfg-mplayer.h,v
retrieving revision 1.131
diff -u -r1.131 cfg-mplayer.h
--- cfg-mplayer.h 3 Feb 2002 09:28:57 -0000 1.131
+++ cfg-mplayer.h 9 Feb 2002 23:20:57 -0000
@@ -242,6 +242,9 @@
{"nozoom", &softzoom, CONF_TYPE_FLAG, 0, 1, 0, NULL},
{"flip", &flip, CONF_TYPE_FLAG, 0, -1, 1, NULL},
{"noflip", &flip, CONF_TYPE_FLAG, 0, -1, 0, NULL},
+#ifdef HAVE_DXR3
+ {"scalefactor", &scalefactor, CONF_TYPE_FLOAT, CONF_RANGE, 0.1, 2.0, NULL},
+#endif
#ifndef USE_LIBVO2
{"bpp", &vo_dbpp, CONF_TYPE_INT, CONF_RANGE, 0, 32, NULL},
Index: libvo/vo_dxr3.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_dxr3.c,v
retrieving revision 1.53
diff -u -r1.53 vo_dxr3.c
--- libvo/vo_dxr3.c 9 Feb 2002 17:40:33 -0000 1.53
+++ libvo/vo_dxr3.c 9 Feb 2002 23:20:57 -0000
@@ -49,6 +49,7 @@
#include "video_out.h"
#include "video_out_internal.h"
#include "../postproc/rgb2rgb.h"
+#include "../postproc/swscale.h"
#ifdef USE_LIBAVCODEC
#ifdef USE_LIBAVCODEC_SO
@@ -79,6 +80,8 @@
static int osd_w, osd_h;
static int noprebuf = 0;
static int img_format = 0;
+static SwsContext * sws = NULL;
+extern float scalefactor;
/* File descriptors */
static int fd_control = -1;
@@ -143,6 +146,7 @@
int tmp1, tmp2;
em8300_register_t reg;
+ /* Softzoom turned on, downscale */
/* This activates the subpicture processor, you can safely disable this and still send */
/* broken subpics to the em8300, if it's enabled and you send broken subpics you will end */
/* up in a lockup */
@@ -183,10 +187,10 @@
v_width = scr_width;
v_height = scr_height;
- /* libmp1e requires a width and height that is x|16 */
- s_width = (v_width + 15) / 16;
+ /* libavcodec requires a width and height that is x|16 */
+ s_width = ((v_width + 15) / 16) * scalefactor;
s_width *= 16;
- s_height = (v_height + 15) / 16;
+ s_height = ((v_height + 15) / 16) * scalefactor;
s_height *= 16;
/* Try to figure out whether to use widescreen output or not */
@@ -214,8 +218,8 @@
}
avc_context = malloc(sizeof(AVCodecContext));
memset(avc_context, 0, sizeof(avc_context));
- avc_context->width = v_width;
- avc_context->height = v_height;
+ avc_context->width = s_width;
+ avc_context->height = s_height;
avc_context->frame_rate = 30 * FRAME_RATE_BASE;
avc_context->gop_size = 12;
avc_context->bit_rate = 8e6;
@@ -227,11 +231,18 @@
uninit();
return -1;
}
+
+ 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 video and osd on screen */
/* Old stuff taken from the dvb driver, should be removed when introducing spuenc */
osd_w = s_width;
- d_pos_x = (s_width - v_width) / 2;
+ d_pos_x = ((v_width * scalefactor) - s_width) / 2;
if (d_pos_x < 0) {
s_pos_x = -d_pos_x;
d_pos_x = 0;
@@ -240,7 +251,7 @@
s_pos_x = 0;
}
osd_h = s_height;
- d_pos_y = (s_height - v_height) / 2;
+ d_pos_y = ((v_height * scalefactor) - s_height) / 2;
if (d_pos_y < 0) {
s_pos_y = -d_pos_y;
d_pos_y = 0;
@@ -251,9 +262,9 @@
/* Create a pixel buffer and set up pointers for color components */
memset(&avc_picture, 0, sizeof(avc_picture));
- avc_picture.linesize[0] = v_width;
- avc_picture.linesize[1] = v_width / 2;
- avc_picture.linesize[2] = v_width / 2;
+ avc_picture.linesize[0] = s_width;
+ avc_picture.linesize[1] = s_width / 2;
+ avc_picture.linesize[2] = s_width / 2;
avc_outbuf = malloc(avc_outbuf_size);
size = s_width * s_height;
@@ -318,14 +329,8 @@
return 0;
#ifdef USE_LIBAVCODEC
} else {
- int size = s_width * s_height;
- if (img_format == IMGFMT_YUY2) {
- yuy2toyv12(src[0], avc_picture.data[0], avc_picture.data[1], avc_picture.data[2],
- v_width, v_height, avc_picture.linesize[0], avc_picture.linesize[1], v_width*2);
- } else if (img_format == IMGFMT_BGR24) {
- rgb24toyv12(src[0], avc_picture.data[0], avc_picture.data[1], avc_picture.data[2],
- v_width, v_height, avc_picture.linesize[0], avc_picture.linesize[1], v_width*3);
- }
+ int size, srcStride = (img_format == IMGFMT_YUY2) ? (v_width * 2) : (v_width * 3);
+ sws->swScale(sws, src, &srcStride, 0, v_height, avc_picture.data, avc_picture.linesize);
draw_osd();
size = avcodec_encode_video(avc_context, avc_outbuf, avc_outbuf_size, &avc_picture);
write(fd_video, avc_outbuf, size);
@@ -352,45 +357,7 @@
{
#ifdef USE_LIBAVCODEC
if (img_format == IMGFMT_YV12) {
- int y;
- unsigned char *s, *s1;
- unsigned char *d, *d1;
-
- x0 += d_pos_x;
- y0 += d_pos_y;
-
- if ((x0 + w) > avc_picture.linesize[0]) {
- w = avc_picture.linesize[0] - x0;
- }
- if ((y0 + h) > s_height) {
- h = s_height - y0;
- }
-
- s = srcimg[0] + s_pos_x + s_pos_y * stride[0];
- d = avc_picture.data[0] + x0 + y0 * avc_picture.linesize[0];
- for(y = 0; y < h; y++) {
- memcpy(d, s, w);
- s += stride[0];
- d += avc_picture.linesize[0];
- }
-
- w /= 2;
- h /= 2;
- x0 /= 2;
- y0 /= 2;
-
- s = srcimg[1] + s_pos_x + (s_pos_y * stride[1]);
- d = avc_picture.data[1] + x0 + (y0 * avc_picture.linesize[1]);
- s1 = srcimg[2] + s_pos_x + (s_pos_y * stride[2]);
- d1 = avc_picture.data[2] + x0 + (y0 * avc_picture.linesize[2]);
- for(y = 0; y < h; y++) {
- memcpy(d, s, w);
- memcpy(d1, s1, w);
- s += stride[1];
- s1 += stride[2];
- d += avc_picture.linesize[1];
- d1 += avc_picture.linesize[2];
- }
+ sws->swScale(sws, srcimg, stride, y0, h, avc_picture.data, avc_picture.linesize);
return 0;
}
#endif
@@ -400,6 +367,9 @@
static void uninit(void)
{
printf("VO: [dxr3] Uninitializing\n");
+ if (sws) {
+ freeSwsContext(sws);
+ }
#ifdef USE_LIBAVCODEC
if (avc_context) {
avcodec_close(avc_context);
More information about the MPlayer-dev-eng
mailing list