Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Converts YCbCr to RGB
- int sceJpegMJpegCscWithColorOption(void *dst, void *srcbuff, unsigned int width_height, unsigned int stride, unsigned int param_5)
- {
- int ret;
- SceDmacPlusCscParams *cscparams;
- int display_colorfmt;
- uint colorfmt;
- uint height, width;
- uint y_plane_half, u_v_plane_half;
- uint dst_buff_half_size;
- int in_k1;
- SceMpegYCrCbBuffer srcparams;
- width = (width_height >> 16) & 0xfff;
- height = width_height & 0xfff;
- display_colorfmt = param_5 & 0xf;
- if ((stride > 1024) || (width > 720) || (height > 480)) {
- return SCE_JPEG_ERROR_UNSUPPORT_IMAGE_SIZE;
- }
- if (display_colorfmt == PSP_DISPLAY_PIXEL_FORMAT_565) {
- colorfmt = SCE_DMACPLUS_LCDC_FORMAT_RGB565;
- } else if (display_colorfmt == PSP_DISPLAY_PIXEL_FORMAT_5551) {
- colorfmt = SCE_DMACPLUS_LCDC_FORMAT_RGBA5551;
- } else if (display_colorfmt == PSP_DISPLAY_PIXEL_FORMAT_4444) {
- colorfmt = SCE_DMACPLUS_LCDC_FORMAT_RGBA4444;
- } else if (display_colorfmt == PSP_DISPLAY_PIXEL_FORMAT_8888) {
- colorfmt = SCE_DMACPLUS_LCDC_FORMAT_RGBA8888;
- } else {
- return SCE_JPEG_ERROR_INVALID_COLOR_FORMAT;
- }
- if (sceKernelGetCompiledSdkVersion() < 0x6030011) {
- colorfmt = colorfmt << 1;
- }
- if ((uint)((int)param_5 >> 4) >= 2) {
- return SCE_JPEG_ERROR_INVALID_COLOR_FORMAT;
- }
- if ((width & 0x70) == 0x70) {
- width = width + 0x10;
- }
- // YUV 4:2:0: for a 2×2 square of pixels, 4 Y samples, 1 U sample and 1 V sample
- y_plane_half = (width * height) / 2;
- u_v_plane_half = (width * height) / 8;
- if (((int)(in_k1 << 0xb & (uint)srcbuff) < 0) || ((int)(in_k1 << 0xb & (uint)dst) < 0)) {
- ret = SCE_ERROR_PRIV_REQUIRED;
- } else {
- dst_buff_half_size = stride * height;
- if (colorfmt == SCE_DMACPLUS_LCDC_FORMAT_RGBA8888) {
- dst_buff_half_size *= 2;
- }
- srcparams.iFrameBufferWidth16 = width / 16;
- srcparams.iFrameBufferHeight16 = height / 16;
- srcparams.pYBuffer = srcbuff;
- srcparams.pYBuffer2 = (void *)((char *)srcbuff + y_plane_half);
- srcparams.pCrBuffer = (void *)((char *)srcparams.pYBuffer2 + y_plane_half);
- srcparams.pCrBuffer2 = (void *)((char *)srcparams.pCrBuffer + u_v_plane_half);
- srcparams.pCbBuffer = (void *)((char *)srcparams.pCrBuffer2 + u_v_plane_half);
- srcparams.pCbBuffer2 = (void *)((char *)srcparams.pCbBuffer + u_v_plane_half);
- srcparams.iUnknown = 0;
- srcparams.iUnknown2 = 1;
- sceKernelDcacheInvalidateRange(dst, dst_buff_half_size * 2);
- if ((int)param_5 >> 4 == 0) {
- cscparams = &csc_YCbCr_to_RGB_full_range;
- } else {
- cscparams = &csc_YCbCr_to_RGB_SDTV;
- }
- dmacplus_set_csc_matrix(colorfmt, stride, cscparams);
- ret = dmacplus_trigger_memcpy3(dst, (char *)dst + dst_buff_half_size, &srcparams);
- sceKernelUnlockMutex(g_SceMpegBaseCSC_mutex, 1);
- }
- return ret;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement