diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dxr3/dxr3_mpeg_encoders.c | 12 | ||||
| -rw-r--r-- | src/dxr3/video_out_dxr3.c | 69 | 
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; | 
