Hi,

I'd like to convert UIImages (from iPhone OS) to AVPicture. I wrote the
code:

- (AVPicture)pictureFromUIImage:(UIImage *)image
{

    CGImageRef imageRef = image.CGImage;
    NSData *data        = (NSData
*)CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
    uint8_t *pixels        = (uint8_t *)[data bytes];
    uint8_t *pixelsR        = (uint8_t *)malloc([data length]/4);
    uint8_t *pixelsG        = (uint8_t *)malloc([data length]/4);
    uint8_t *pixelsB        = (uint8_t *)malloc([data length]/4);
    uint8_t *pixelsA        = (uint8_t *)malloc([data length]/4);
    int p = 0;
    for(int i = 0; i < [data length]; i += 4)
    {
        int r = i ; int g = i+1; int b = i+2; int a = i+3;
        pixelsR[p]   = pixels[r];
        pixelsG[p]   = pixels[g];
        pixelsB[p]   = pixels[b];
        pixelsA[p]       = pixels[a];
        p++;
    }

    // Allocate RGB picture
    AVPicture pict;
    avpicture_alloc(&pict, PIX_FMT_RGB24, outputWidth, outputHeight);

    AVFrame *rgbFrame = avcodec_alloc_frame();

    rgbFrame->data[0] = pixelsR;
    rgbFrame->data[1] = pixelsG;
    rgbFrame->data[2] = pixelsB;
    rgbFrame->linesize[0] = outputWidth;
    //rgbFrame->linesize[1] = outputWidth;
    //rgbFrame->linesize[2] = outputWidth;

    // Setup scaler
    static int sws_flags =  SWS_FAST_BILINEAR;
    struct SwsContext *pictContext = sws_getContext(pCodecCtx->width,
                                     pCodecCtx->height,
                                     pCodecCtx->pix_fmt,
                                     outputWidth,
                                     outputHeight,
                                     PIX_FMT_RGB24,
                                     sws_flags, NULL, NULL, NULL);

    sws_scale(pictContext, rgbFrame->data, rgbFrame->linesize,
              0, pCodecCtx->height, pict.data,
              pict.linesize);

    return pict;
}

Than i write it on hard disk using:

   // Write header
    fprintf(pFile, "P6\n%d %d\n255\n", width, height);

    // Write pixel data
    for(y=0; y<height; y++)
        fwrite(pict.data[0]+y*pict.linesize[0], 1, width*3, pFile);

And this code doesn't convert images properly. Can anybody help me ?
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to