第51月第27天 AAPLEAGLLayer.m
1.
https://github.com/stevenyao/iOSHardwareDecoder
https://github.com/LevyGG/iOS-H.264-hareware-encode-and-decode
2.
opengles
https://www.jianshu.com/c/30e2e76bc140
https://github.com/QinminiOS/OpenGLES
gpuimage
https://github.com/QinminiOS/GPUImage
https://www.jianshu.com/c/4510dd854806
3.
toyuv
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sample);
CVPixelBufferLockBaseAddress(pixelBuffer, 0); // 获取CVImageBufferRef中的y数据 UInt8 *pY = (UInt8 *)CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); // 获取CMVImageBufferRef中的uv数据 UInt8 *pUV = (UInt8 *)CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1); size_t width = CVPixelBufferGetWidth(pixelBuffer); size_t height = CVPixelBufferGetHeight(pixelBuffer); size_t pYBytes = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0); size_t pUVBytes = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1); UInt8 *pYUV420P = (UInt8 *)malloc(width * height * 3 / 2); UInt8 *pU = pYUV420P + (width * height); UInt8 *pV = pU + (width * height / 4); for(int i = 0; i < height; i++) { memcpy(pYUV420P + i * width, pY + i * pYBytes, width); } for(int j = 0; j < height / 2; j++) { for(int i = 0; i < width / 2; i++) { *(pU++) = pUV[i<<1]; *(pV++) = pUV[(i<<1) + 1]; } pUV += pUVBytes; } free(pYUV420P); CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
topixelBuffer
- (CVPixelBufferRef) copyDataFromBuffer:(const unsigned char*)buffer toYUVPixelBufferWithWidth:(size_t)width Height:(size_t)height { uint8_t* nv12 = buffer; NSDictionary *pixelAttributes = @{(NSString*)kCVPixelBufferIOSurfacePropertiesKey:@{}}; CVPixelBufferRef pixelBuffer = NULL; CVReturn result = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, (__bridge CFDictionaryRef)(pixelAttributes), &pixelBuffer); size_t pYBytes = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0); size_t pUVBytes = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1); CVPixelBufferLockBaseAddress(pixelBuffer,0); unsigned char *yDestPlane = (unsigned char *)CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); unsigned char *y_ch0 = nv12; unsigned char *y_ch1 = nv12 + width * height; // memcpy(yDestPlane, y_ch0, width * height); for(int i = 0; i < height; i++) { memcpy(yDestPlane + i * pYBytes, y_ch0 + i * width, width); } unsigned char *uvDestPlane = (unsigned char *)CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1); // memcpy(uvDestPlane, y_ch1, width * height/2); UInt8 *pU = nv12 + (width * height); UInt8 *pV = pU + (width * height / 4); for(int j = 0; j < height / 2; j++) { for(int i = 0; i < width / 2; i++) { uvDestPlane[i<<1] = *(pU++) ; uvDestPlane[(i<<1) + 1] = *(pV++); } uvDestPlane += pUVBytes; } // if (nv12) { // free(nv12); // } CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); if (result != kCVReturnSuccess) { NSLog(@"Unable to create cvpixelbuffer %d", result); } return pixelBuffer; }
https://www.jianshu.com/p/7da76246ce82
//nv12,uv分量交替存储;YUV420,uv分量分层存储
https://blog.csdn.net/u013472201/article/details/105300770/