Advertisement
xerpi

sceJpegMJpegCscWithColorOption

Mar 28th, 2021 (edited)
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.76 KB | None | 0 0
  1. // Converts YCbCr to RGB
  2. int sceJpegMJpegCscWithColorOption(void *dst, void *srcbuff, unsigned int width_height, unsigned int stride, unsigned int param_5)
  3. {
  4.     int ret;
  5.     SceDmacPlusCscParams *cscparams;
  6.     int display_colorfmt;
  7.     uint colorfmt;
  8.     uint height, width;
  9.     uint y_plane_half, u_v_plane_half;
  10.     uint dst_buff_half_size;
  11.     int in_k1;
  12.     SceMpegYCrCbBuffer srcparams;
  13.    
  14.     width = (width_height >> 16) & 0xfff;
  15.     height = width_height & 0xfff;
  16.     display_colorfmt = param_5 & 0xf;
  17.    
  18.     if ((stride > 1024) || (width > 720) || (height > 480)) {
  19.         return SCE_JPEG_ERROR_UNSUPPORT_IMAGE_SIZE;
  20.     }
  21.  
  22.     if (display_colorfmt == PSP_DISPLAY_PIXEL_FORMAT_565) {
  23.         colorfmt = SCE_DMACPLUS_LCDC_FORMAT_RGB565;
  24.     } else if (display_colorfmt == PSP_DISPLAY_PIXEL_FORMAT_5551) {
  25.         colorfmt = SCE_DMACPLUS_LCDC_FORMAT_RGBA5551;
  26.     } else if (display_colorfmt == PSP_DISPLAY_PIXEL_FORMAT_4444) {
  27.         colorfmt = SCE_DMACPLUS_LCDC_FORMAT_RGBA4444;
  28.     } else if (display_colorfmt == PSP_DISPLAY_PIXEL_FORMAT_8888) {
  29.         colorfmt = SCE_DMACPLUS_LCDC_FORMAT_RGBA8888;
  30.     } else {
  31.         return SCE_JPEG_ERROR_INVALID_COLOR_FORMAT;
  32.     }
  33.    
  34.     if (sceKernelGetCompiledSdkVersion() < 0x6030011) {
  35.         colorfmt = colorfmt << 1;
  36.     }
  37.    
  38.     if ((uint)((int)param_5 >> 4) >= 2) {
  39.         return SCE_JPEG_ERROR_INVALID_COLOR_FORMAT;
  40.     }
  41.        
  42.     if ((width & 0x70) == 0x70) {
  43.         width = width + 0x10;
  44.     }
  45.    
  46.     // YUV 4:2:0: for a 2×2 square of pixels, 4 Y samples, 1 U sample and 1 V sample
  47.     y_plane_half = (width * height) / 2;
  48.     u_v_plane_half = (width * height) / 8;
  49.    
  50.     if (((int)(in_k1 << 0xb & (uint)srcbuff) < 0) || ((int)(in_k1 << 0xb & (uint)dst) < 0)) {
  51.         ret = SCE_ERROR_PRIV_REQUIRED;
  52.     } else {
  53.         dst_buff_half_size = stride * height;
  54.         if (colorfmt == SCE_DMACPLUS_LCDC_FORMAT_RGBA8888) {
  55.             dst_buff_half_size *= 2;
  56.         }
  57.         srcparams.iFrameBufferWidth16 = width / 16;
  58.         srcparams.iFrameBufferHeight16 = height / 16;
  59.         srcparams.pYBuffer   = srcbuff;
  60.         srcparams.pYBuffer2  = (void *)((char *)srcbuff              + y_plane_half);
  61.         srcparams.pCrBuffer  = (void *)((char *)srcparams.pYBuffer2  + y_plane_half);
  62.         srcparams.pCrBuffer2 = (void *)((char *)srcparams.pCrBuffer  + u_v_plane_half);
  63.         srcparams.pCbBuffer  = (void *)((char *)srcparams.pCrBuffer2 + u_v_plane_half);
  64.         srcparams.pCbBuffer2 = (void *)((char *)srcparams.pCbBuffer  + u_v_plane_half);
  65.         srcparams.iUnknown   = 0;
  66.         srcparams.iUnknown2  = 1;
  67.         sceKernelDcacheInvalidateRange(dst, dst_buff_half_size * 2);
  68.         if ((int)param_5 >> 4 == 0) {
  69.             cscparams = &csc_YCbCr_to_RGB_full_range;
  70.         } else {
  71.             cscparams = &csc_YCbCr_to_RGB_SDTV;
  72.         }
  73.         dmacplus_set_csc_matrix(colorfmt, stride, cscparams);
  74.         ret = dmacplus_trigger_memcpy3(dst, (char *)dst + dst_buff_half_size, &srcparams);
  75.         sceKernelUnlockMutex(g_SceMpegBaseCSC_mutex, 1);
  76.     }
  77.    
  78.     return ret;
  79. }
  80.  
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement