summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dxr3/dxr3_mpeg_encoders.c12
-rw-r--r--src/dxr3/video_out_dxr3.c69
2 files changed, 43 insertions, 38 deletions
diff --git a/src/dxr3/dxr3_mpeg_encoders.c b/src/dxr3/dxr3_mpeg_encoders.c
index 04a07d0bc..9c40c5ed8 100644
--- a/src/dxr3/dxr3_mpeg_encoders.c
+++ b/src/dxr3/dxr3_mpeg_encoders.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: dxr3_mpeg_encoders.c,v 1.6 2002/07/08 16:35:32 mroi Exp $
+ * $Id: dxr3_mpeg_encoders.c,v 1.7 2002/07/16 16:21:14 mroi Exp $
*/
/* mpeg encoders for the dxr3 video out plugin.
@@ -149,13 +149,13 @@ static int rte_on_update_format(dxr3_driver_t *drv, dxr3_frame_t *frame)
this->context = 0;
}
- if ((drv->video_width % 16 != 0) || (drv->video_oheight % 16 != 0)) {
+ if ((frame->vo_frame.pitches[0] % 16 != 0) || (frame->oheight % 16 != 0)) {
printf("dxr3_mpeg_encoder: rte only handles video dimensions which are multiples of 16\n");
return 0;
}
- this->width = drv->video_width;
- this->height = drv->video_oheight;
+ this->width = frame->vo_frame.pitches[0];
+ this->height = frame->oheight;
/* create new rte context */
this->context = rte_context_new(this->width, this->height, "mp1e", drv);
@@ -253,9 +253,9 @@ static int rte_on_display_frame(dxr3_driver_t *drv, dxr3_frame_t *frame)
int size;
rte_data_t* this = (rte_data_t *)drv->enc;
- if ((this->width == frame->width) && (this->height == frame->oheight)) {
+ if ((this->width == frame->vo_frame.pitches[0]) && (this->height == frame->oheight)) {
/* This frame belongs to current context. */
- size = frame->width * frame->oheight;
+ size = frame->vo_frame.pitches[0] * frame->oheight;
if (frame->vo_frame.format == IMGFMT_YV12)
xine_fast_memcpy(this->rte_ptr, frame->real_base[0], size * 3/2);
else
diff --git a/src/dxr3/video_out_dxr3.c b/src/dxr3/video_out_dxr3.c
index c459ace4b..c995e9103 100644
--- a/src/dxr3/video_out_dxr3.c
+++ b/src/dxr3/video_out_dxr3.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: video_out_dxr3.c,v 1.39 2002/07/10 14:09:56 mroi Exp $
+ * $Id: video_out_dxr3.c,v 1.40 2002/07/16 16:21:14 mroi Exp $
*/
/* mpeg1 encoding video out plugin for the dxr3.
@@ -507,8 +507,8 @@ static void dxr3_update_frame_format(vo_driver_t *this_gen, vo_frame_t *frame_ge
}
/* find closest multiple of 16 */
- oheight = 16*(int)(oheight / 16. + 0.5);
- if (oheight < height) oheight = height;
+ oheight = 16 * (int)(oheight / 16. + 0.5);
+ if (oheight < height) oheight += 16;
/* Tell the viewers about the aspect ratio stuff. */
if (oheight - height > 0)
@@ -542,62 +542,67 @@ static void dxr3_update_frame_format(vo_driver_t *this_gen, vo_frame_t *frame_ge
* so old and new macroblocks overlap */
this->top_bar = ((oheight - height) / 32) * 16;
if (format == IMGFMT_YUY2) {
- int image_size = width * oheight; /* includes black bars */
+ int image_size;
+
+ /* calculate pitch and size including black bars */
+ frame->vo_frame.pitches[0] = 32*((width + 15) / 16);
+ image_size = frame->vo_frame.pitches[0] * oheight;
/* planar format, only base[0] */
/* add one extra line for field swap stuff */
- frame->real_base[0] = xine_xmalloc_aligned(16, (image_size + width) * 2,
+ frame->real_base[0] = xine_xmalloc_aligned(16, image_size + frame->vo_frame.pitches[0],
(void**)&frame->mem);
/* don't use first line */
- frame->real_base[0] += width * 2;
+ frame->real_base[0] += frame->vo_frame.pitches[0];
frame->real_base[1] = frame->real_base[2] = 0;
/* fix offset, so the decoder does not see the top black bar */
- frame->vo_frame.base[0] = frame->real_base[0] + width * 2 * this->top_bar;
+ frame->vo_frame.base[0] = frame->real_base[0] + frame->vo_frame.pitches[0] * this->top_bar;
frame->vo_frame.base[1] = frame->vo_frame.base[2] = 0;
/* fill with black (yuy2 16,128,16,128,...) */
- memset(frame->real_base[0], 128, 2 * image_size); /* U and V */
- for (i = 0; i < 2 * image_size; i += 2) /* Y */
+ memset(frame->real_base[0], 128, image_size); /* U and V */
+ for (i = 0; i < image_size; i += 2) /* Y */
*(frame->real_base[0] + i) = 16;
} else { /* IMGFMT_YV12 */
- int image_size = width * oheight; /* includes black bars */
+ int image_size_y, image_size_u, image_size_v;
+ /* calculate pitches and sizes including black bars */
+ frame->vo_frame.pitches[0] = 16*((width + 15) / 16);
+ frame->vo_frame.pitches[1] = 8*((width + 15) / 16);
+ frame->vo_frame.pitches[2] = 8*((width + 15) / 16);
+ image_size_y = frame->vo_frame.pitches[0] * oheight;
+ image_size_u = frame->vo_frame.pitches[1] * ((oheight + 1) / 2);
+ image_size_v = frame->vo_frame.pitches[2] * ((oheight + 1) / 2);
+
/* add one extra line for field swap stuff */
- frame->real_base[0] = xine_xmalloc_aligned(16, (image_size + width) * 3/2,
- (void**)&frame->mem);
+ frame->real_base[0] = xine_xmalloc_aligned(16, image_size_y + frame->vo_frame.pitches[0] +
+ image_size_u + image_size_v, (void**)&frame->mem);
/* don't use first line */
- frame->real_base[0] += width;
- frame->real_base[1] = frame->real_base[0] + image_size;
- frame->real_base[2] = frame->real_base[1] + image_size/4;
+ frame->real_base[0] += frame->vo_frame.pitches[0];
+ frame->real_base[1] = frame->real_base[0] + image_size_y;
+ frame->real_base[2] = frame->real_base[1] + image_size_u;
/* fix offsets, so the decoder does not see the top black bar */
- frame->vo_frame.base[0] = frame->real_base[0] + width * this->top_bar;
- frame->vo_frame.base[1] = frame->real_base[1] + width * this->top_bar/4;
- frame->vo_frame.base[2] = frame->real_base[2] + width * this->top_bar/4;
+ frame->vo_frame.base[0] = frame->real_base[0] + frame->vo_frame.pitches[0] * this->top_bar;
+ frame->vo_frame.base[1] = frame->real_base[1] + frame->vo_frame.pitches[1] * this->top_bar / 2;
+ frame->vo_frame.base[2] = frame->real_base[2] + frame->vo_frame.pitches[2] * this->top_bar / 2;
/* fill with black (yuv 16,128,128) */
- memset(frame->real_base[0], 16, image_size);
- memset(frame->real_base[1], 128, image_size/4);
- memset(frame->real_base[2], 128, image_size/4);
+ memset(frame->real_base[0], 16, image_size_y);
+ memset(frame->real_base[1], 128, image_size_u);
+ memset(frame->real_base[2], 128, image_size_v);
}
}
if (this->swap_fields != frame->swap_fields) {
- if (format == IMGFMT_YUY2) {
- if (this->swap_fields)
- frame->vo_frame.base[0] -= width *2;
- else
- frame->vo_frame.base[0] += width *2;
- } else {
- if (this->swap_fields)
- frame->vo_frame.base[0] -= width;
- else
- frame->vo_frame.base[0] += width;
- }
+ if (this->swap_fields)
+ frame->vo_frame.base[0] -= frame->vo_frame.pitches[0];
+ else
+ frame->vo_frame.base[0] += frame->vo_frame.pitches[0];
}
frame->width = width;