Преобразование vImageConvert_422CbYpCrYp8ToARGB8888 отсутствует красный и черный/альфа — какао

#objective-c #cocoa #image-processing #image-conversion #accelerate-framework

Вопрос:

Я пытаюсь преобразовать CVPixelBuffer формат из YUV(‘2vuy’) в ARGB, используя Accelerate фреймворк с приведенным ниже кодом.

     CVPixelBufferLockBaseAddress(pixelBuffer, 0);
    
    void* baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer);
    size_t srcBufferWidth = CVPixelBufferGetWidth(pixelBuffer);
    size_t srcBufferHeight = CVPixelBufferGetHeight(pixelBuffer);
    size_t srcBufferBytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
    
    vImage_Error err = kvImageNoError;
    
    static vImage_YpCbCrToARGB outInfo;
    static bool infoGenerated = false;
    if (!infoGenerated) {
        vImage_YpCbCrPixelRange pixelRange;
        pixelRange.Yp_bias         =   16;
        pixelRange.CbCr_bias       =  128;
        pixelRange.YpRangeMax      =  235;
        pixelRange.CbCrRangeMax    =  240;
        pixelRange.YpMax           =  255;
        pixelRange.YpMin           =    0;
        pixelRange.CbCrMax         =  255;
        pixelRange.CbCrMin         =    1;

        const vImage_YpCbCrToARGBMatrix *matrixYpCbCrToARGB = kvImage_YpCbCrToARGBMatrix_ITU_R_709_2;
        
        err = vImageConvert_YpCbCrToARGB_GenerateConversion(matrixYpCbCrToARGB, amp;pixelRange, amp;outInfo, kvImage422CbYpCrYp8, kvImageARGB8888, kvImageNoFlags);
        
        if (err ==kvImageNoError) {
            infoGenerated = true;
        }
    }
    
    
    
    if (infoGenerated) {
        const uint8_t permuteMap[4] = {0, 1, 2, 3};

        vImage_Buffer srcBuffer = { (void *)baseAddress, srcBufferHeight, srcBufferWidth, srcBufferBytesPerRow};
        
        void *destData = malloc(srcBufferWidth * srcBufferHeight * 4);
        
        vImage_Buffer destBuffer = {
            .data = destData,
            .width = srcBufferWidth,
            .height = srcBufferHeight,
            .rowBytes = srcBufferWidth * 4
        };
        
        err = vImageConvert_422CbYpCrYp8ToARGB8888(amp;srcBuffer, amp;destBuffer, amp;outInfo, permuteMap, 0, kvImageNoFlags);
        
        if (err!=kvImageNoError) {
            NSLog(@"vImage_Error converting vImageConvert_422CbYpCrYp8ToARGB8888 errorcode:%ld",err);
        }
        CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
    }
 

Преобразование выполнено успешно, но результирующий буфер назначения имеет синий оттенок. Я хочу, чтобы он был в оригинальном цвете. Что я здесь упускаю или делаю не так?

Исходный буфер: Исходный буфер

Буфер назначения: Буфер назначения

Комментарии:

1. пытался vImageConvert_YpCbCrToARGB_GenerateConversion , но безуспешно.

2. Решение, которое я отметил как правильное, работает отлично, но оно использует много процессора. Поэтому я попробовал ваше решение и обнаружил эту проблему.