int image_input(IMAGE * image, uint32_t width, int height, uint32_t edged_width, uint8_t * src[4], int src_stride[4], int csp, int interlacing) { #if 1 const int edged_width2 = edged_width/2; //const int width2 = width/2; const int height2 = height/2; #if swust uint32_t idy,idu,idv; uint8_t *p_logo; uint32_t i; #endif yv12_to_yv12(image->y, image->u, image->v, edged_width, edged_width2, src[0], src[0] + src_stride[0]*height, src[0] + src_stride[0]*height + (src_stride[0]/2)*height2, src_stride[0], src_stride[0]/2, width, height, (csp & (1<<31))); //H264_CSP_VFLIP #if swust //////////////////////////////////////////////////////////////////////////////////////////// p_logo = (void *)&logo_data; //idy = DAT_copy2d(DAT_1D2D,p_logo,image->y + width - 64-8+4*edged_width ,64,16, edged_width); //idu = DAT_copy2d(DAT_1D2D,p_logo+64*16,image->u+width/2-32-4+2*edged_width2 ,32,8, edged_width2); //idv = DAT_copy2d(DAT_1D2D,p_logo+64*16*5/4,image->v+width/2-32-4+2*edged_width2 ,32,8, edged_width2); for (i=0; i<(64*16*3/2); i++) logo_data[i] -= 16; for (i=0; i<16; i++) { memcpy(image->y + width - 64-8+4*edged_width+i*edged_width, p_logo+i*64, 64); memcpy(image->y + width - 64-8+4*edged_width+(i+16)*edged_width, p_logo+i*64, 64); } for (i=0; i< 8; i++) { memcpy(image->u+width/2-32-4+2*edged_width2+i*edged_width2,p_logo+64*16+i*32, 32); memcpy(image->u+width/2-32-4+2*edged_width2+(i+8)*edged_width2,p_logo+64*16+i*32, 32); memcpy(image->v+width/2-32-4+2*edged_width2+i*edged_width2,p_logo+64*16*5/4+i*32,32); memcpy(image->v+width/2-32-4+2*edged_width2+(i+8)*edged_width2,p_logo+64*16*5/4+i*32,32); } //DAT_wait(idy); //DAT_wait(idu); //DAT_wait(idv); //////////////////////////////////////////////////////////////////////////////////////////// #endif return 0; #else const int edged_width2 = edged_width/2; const int width2 = width/2; const int height2 = height/2; #if 0 const int height_signed = (csp & H264_CSP_VFLIP) ? -height : height; #endif switch (csp & ~H264_CSP_VFLIP) { case H264_CSP_RGB555: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?rgb555i_to_yv12 :rgb555_to_yv12, interlacing?rgb555i_to_yv12_c:rgb555_to_yv12_c, 2); break; case H264_CSP_RGB565: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?rgb565i_to_yv12 :rgb565_to_yv12, interlacing?rgb565i_to_yv12_c:rgb565_to_yv12_c, 2); break; case H264_CSP_BGR: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?bgri_to_yv12 :bgr_to_yv12, interlacing?bgri_to_yv12_c:bgr_to_yv12_c, 3); break; case H264_CSP_BGRA: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?bgrai_to_yv12 :bgra_to_yv12, interlacing?bgrai_to_yv12_c:bgra_to_yv12_c, 4); break; case H264_CSP_ABGR : safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?abgri_to_yv12 :abgr_to_yv12, interlacing?abgri_to_yv12_c:abgr_to_yv12_c, 4); break; case H264_CSP_RGBA : safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?rgbai_to_yv12 :rgba_to_yv12, interlacing?rgbai_to_yv12_c:rgba_to_yv12_c, 4); break; case H264_CSP_ARGB: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?argbi_to_yv12 : argb_to_yv12, interlacing?argbi_to_yv12_c: argb_to_yv12_c, 4); break; case H264_CSP_YUY2: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yuyvi_to_yv12 :yuyv_to_yv12, interlacing?yuyvi_to_yv12_c:yuyv_to_yv12_c, 2); break; case H264_CSP_YVYU: /* u/v swapped */ safe_packed_conv( src[0], src_stride[0], image->y, image->v, image->u, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yuyvi_to_yv12 :yuyv_to_yv12, interlacing?yuyvi_to_yv12_c:yuyv_to_yv12_c, 2); break; case H264_CSP_UYVY: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?uyvyi_to_yv12 :uyvy_to_yv12, interlacing?uyvyi_to_yv12_c:uyvy_to_yv12_c, 2); break; case H264_CSP_I420: /* YCbCr == YUV == internal colorspace for MPEG */ yv12_to_yv12(image->y, image->u, image->v, edged_width, edged_width2, src[0], src[0] + src_stride[0]*height, src[0] + src_stride[0]*height + (src_stride[0]/2)*height2, src_stride[0], src_stride[0]/2, width, height, (csp & H264_CSP_VFLIP)); break; case H264_CSP_YV12: /* YCrCb == YVA == U and V plane swapped */ yv12_to_yv12(image->y, image->v, image->u, edged_width, edged_width2, src[0], src[0] + src_stride[0]*height, src[0] + src_stride[0]*height + (src_stride[0]/2)*height2, src_stride[0], src_stride[0]/2, width, height, (csp & H264_CSP_VFLIP)); break; case H264_CSP_PLANAR: /* YCbCr with arbitrary pointers and different strides for Y and UV */ yv12_to_yv12(image->y, image->u, image->v, edged_width, edged_width2, src[0], src[1], src[2], src_stride[0], src_stride[1], /* v: dst_stride[2] not yet supported */ width, height, (csp & H264_CSP_VFLIP)); break; case H264_CSP_NULL: break; default : return -1; } /* pad out image when the width and/or height is not a multiple of 16 */ if (width & 15) { int i; int pad_width = 16 - (width&15); for (i = 0; i < height; i++) { memset(image->y + i*edged_width + width, *(image->y + i*edged_width + width - 1), pad_width); } for (i = 0; i < height/2; i++) { memset(image->u + i*edged_width2 + width2, *(image->u + i*edged_width2 + width2 - 1),pad_width/2); memset(image->v + i*edged_width2 + width2, *(image->v + i*edged_width2 + width2 - 1),pad_width/2); } } if (height & 15) { int pad_height = 16 - (height&15); int length = ((width+15)/16)*16; int i; for (i = 0; i < pad_height; i++) { memcpy(image->y + (height+i)*edged_width, image->y + (height-1)*edged_width,length); } for (i = 0; i < pad_height/2; i++) { memcpy(image->u + (height2+i)*edged_width2, image->u + (height2-1)*edged_width2,length/2); memcpy(image->v + (height2+i)*edged_width2, image->v + (height2-1)*edged_width2,length/2); } } /* if (interlacing) image_printf(image, edged_width, height, 5,5, "[i]"); image_dump_yuvpgm(image, edged_width, ((width+15)/16)*16, ((height+15)/16)*16, "\\encode.pgm"); */ return 0; #endif }
int image_output(IMAGE * image, uint32_t width, int height, uint32_t edged_width, uint8_t * dst[4], int dst_stride[4], int csp, int interlacing) { const int edged_width2 = edged_width/2; int height2 = height/2; /* if (interlacing) image_printf(image, edged_width, height, 5,100, "[i]=%i,%i",width,height); image_dump_yuvpgm(image, edged_width, width, height, "\\decode.pgm"); */ switch (csp & ~H264_CSP_VFLIP) { case H264_CSP_RGB555: safe_packed_conv( dst[0], dst_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_rgb555i :yv12_to_rgb555, interlacing?yv12_to_rgb555i_c:yv12_to_rgb555_c, 2); return 0; case H264_CSP_RGB565: safe_packed_conv( dst[0], dst_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_rgb565i :yv12_to_rgb565, interlacing?yv12_to_rgb565i_c:yv12_to_rgb565_c, 2); return 0; case H264_CSP_BGR: safe_packed_conv( dst[0], dst_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_bgri :yv12_to_bgr, interlacing?yv12_to_bgri_c:yv12_to_bgr_c, 3); return 0; case H264_CSP_BGRA: safe_packed_conv( dst[0], dst_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_bgrai :yv12_to_bgra, interlacing?yv12_to_bgrai_c:yv12_to_bgra_c, 4); return 0; case H264_CSP_ABGR: safe_packed_conv( dst[0], dst_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_abgri :yv12_to_abgr, interlacing?yv12_to_abgri_c:yv12_to_abgr_c, 4); return 0; case H264_CSP_RGBA: safe_packed_conv( dst[0], dst_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_rgbai :yv12_to_rgba, interlacing?yv12_to_rgbai_c:yv12_to_rgba_c, 4); return 0; case H264_CSP_ARGB: safe_packed_conv( dst[0], dst_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_argbi :yv12_to_argb, interlacing?yv12_to_argbi_c:yv12_to_argb_c, 4); return 0; case H264_CSP_YUY2: safe_packed_conv( dst[0], dst_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_yuyvi :yv12_to_yuyv, interlacing?yv12_to_yuyvi_c:yv12_to_yuyv_c, 2); return 0; case H264_CSP_YVYU: /* u,v swapped */ safe_packed_conv( dst[0], dst_stride[0], image->y, image->v, image->u, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_yuyvi :yv12_to_yuyv, interlacing?yv12_to_yuyvi_c:yv12_to_yuyv_c, 2); return 0; case H264_CSP_UYVY: safe_packed_conv( dst[0], dst_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP), interlacing?yv12_to_uyvyi :yv12_to_uyvy, interlacing?yv12_to_uyvyi_c:yv12_to_uyvy_c, 2); return 0; case H264_CSP_I420: /* YCbCr == YUV == internal colorspace for MPEG */ yv12_to_yv12(dst[0], dst[0] + dst_stride[0]*height, dst[0] + dst_stride[0]*height + (dst_stride[0]/2)*height2, dst_stride[0], dst_stride[0]/2, image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP)); return 0; case H264_CSP_YV12: /* YCrCb == YVU == U and V plane swapped */ yv12_to_yv12(dst[0], dst[0] + dst_stride[0]*height, dst[0] + dst_stride[0]*height + (dst_stride[0]/2)*height2, dst_stride[0], dst_stride[0]/2, image->y, image->v, image->u, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP)); return 0; case H264_CSP_PLANAR: /* YCbCr with arbitrary pointers and different strides for Y and UV */ yv12_to_yv12(dst[0], dst[1], dst[2], dst_stride[0], dst_stride[1], /* v: dst_stride[2] not yet supported */ image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & H264_CSP_VFLIP)); return 0; case H264_CSP_INTERNAL : dst[0] = image->y; dst[1] = image->u; dst[2] = image->v; dst_stride[0] = edged_width; dst_stride[1] = edged_width/2; dst_stride[2] = edged_width/2; return 0; case H264_CSP_NULL: case H264_CSP_SLICE: return 0; } return -1; }
int image_input(IMAGE * image, uint32_t width, int height, uint32_t edged_width, uint8_t * src[4], int src_stride[4], int csp, int interlacing) { const int edged_width2 = edged_width/2; const int width2 = width/2; const int height2 = height/2; #if 0 const int height_signed = (csp & XVID_CSP_VFLIP) ? -height : height; #endif switch (csp & ~XVID_CSP_VFLIP) { case XVID_CSP_RGB555: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?rgb555i_to_yv12 :rgb555_to_yv12, interlacing?rgb555i_to_yv12_c:rgb555_to_yv12_c, 2); break; case XVID_CSP_RGB565: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?rgb565i_to_yv12 :rgb565_to_yv12, interlacing?rgb565i_to_yv12_c:rgb565_to_yv12_c, 2); break; case XVID_CSP_BGR: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?bgri_to_yv12 :bgr_to_yv12, interlacing?bgri_to_yv12_c:bgr_to_yv12_c, 3); break; case XVID_CSP_BGRA: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?bgrai_to_yv12 :bgra_to_yv12, interlacing?bgrai_to_yv12_c:bgra_to_yv12_c, 4); break; case XVID_CSP_ABGR : safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?abgri_to_yv12 :abgr_to_yv12, interlacing?abgri_to_yv12_c:abgr_to_yv12_c, 4); break; case XVID_CSP_RGBA : safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?rgbai_to_yv12 :rgba_to_yv12, interlacing?rgbai_to_yv12_c:rgba_to_yv12_c, 4); break; case XVID_CSP_ARGB: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?argbi_to_yv12 : argb_to_yv12, interlacing?argbi_to_yv12_c: argb_to_yv12_c, 4); break; case XVID_CSP_YUY2: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?yuyvi_to_yv12 :yuyv_to_yv12, interlacing?yuyvi_to_yv12_c:yuyv_to_yv12_c, 2); break; case XVID_CSP_YVYU: /* u/v swapped */ safe_packed_conv( src[0], src_stride[0], image->y, image->v, image->u, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?yuyvi_to_yv12 :yuyv_to_yv12, interlacing?yuyvi_to_yv12_c:yuyv_to_yv12_c, 2); break; case XVID_CSP_UYVY: safe_packed_conv( src[0], src_stride[0], image->y, image->u, image->v, edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), interlacing?uyvyi_to_yv12 :uyvy_to_yv12, interlacing?uyvyi_to_yv12_c:uyvy_to_yv12_c, 2); break; case XVID_CSP_I420: /* YCbCr == YUV == internal colorspace for MPEG */ yv12_to_yv12(image->y, image->u, image->v, edged_width, edged_width2, src[0], src[0] + src_stride[0]*height, src[0] + src_stride[0]*height + (src_stride[0]/2)*height2, src_stride[0], src_stride[0]/2, width, height, (csp & XVID_CSP_VFLIP)); break; case XVID_CSP_YV12: /* YCrCb == YVA == U and V plane swapped */ yv12_to_yv12(image->y, image->v, image->u, edged_width, edged_width2, src[0], src[0] + src_stride[0]*height, src[0] + src_stride[0]*height + (src_stride[0]/2)*height2, src_stride[0], src_stride[0]/2, width, height, (csp & XVID_CSP_VFLIP)); break; case XVID_CSP_PLANAR: /* YCbCr with arbitrary pointers and different strides for Y and UV */ yv12_to_yv12(image->y, image->u, image->v, edged_width, edged_width2, src[0], src[1], src[2], src_stride[0], src_stride[1], /* v: dst_stride[2] not yet supported */ width, height, (csp & XVID_CSP_VFLIP)); break; case XVID_CSP_NULL: break; default : return -1; } /* pad out image when the width and/or height is not a multiple of 16 */ if (width & 15) { int i; int pad_width = 16 - (width&15); for (i = 0; i < height; i++) { memset(image->y + i*edged_width + width, *(image->y + i*edged_width + width - 1), pad_width); } for (i = 0; i < height/2; i++) { memset(image->u + i*edged_width2 + width2, *(image->u + i*edged_width2 + width2 - 1),pad_width/2); memset(image->v + i*edged_width2 + width2, *(image->v + i*edged_width2 + width2 - 1),pad_width/2); } } if (height & 15) { int pad_height = 16 - (height&15); int length = ((width+15)/16)*16; int i; for (i = 0; i < pad_height; i++) { memcpy(image->y + (height+i)*edged_width, image->y + (height-1)*edged_width,length); } for (i = 0; i < pad_height/2; i++) { memcpy(image->u + (height2+i)*edged_width2, image->u + (height2-1)*edged_width2,length/2); memcpy(image->v + (height2+i)*edged_width2, image->v + (height2-1)*edged_width2,length/2); } } /* if (interlacing) image_printf(image, edged_width, height, 5,5, "[i]"); image_dump_yuvpgm(image, edged_width, ((width+15)/16)*16, ((height+15)/16)*16, "\\encode.pgm"); */ return 0; }