From: Michael R. <mr...@us...> - 2002-07-16 16:21:18
|
Update of /cvsroot/xine/xine-lib/src/dxr3 In directory usw-pr-cvs1:/tmp/cvs-serv14048/src/dxr3 Modified Files: dxr3_mpeg_encoders.c video_out_dxr3.c Log Message: use pitching to ensure dimensions are multiples of 16 for librte Index: dxr3_mpeg_encoders.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/dxr3/dxr3_mpeg_encoders.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- dxr3_mpeg_encoders.c 8 Jul 2002 16:35:32 -0000 1.6 +++ dxr3_mpeg_encoders.c 16 Jul 2002 16:21:14 -0000 1.7 @@ -149,13 +149,13 @@ 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 @@ 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 Index: video_out_dxr3.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/dxr3/video_out_dxr3.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- video_out_dxr3.c 10 Jul 2002 14:09:56 -0000 1.39 +++ video_out_dxr3.c 16 Jul 2002 16:21:14 -0000 1.40 @@ -507,8 +507,8 @@ } /* 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 @@ * 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; |