0

Sorry that I still cannot post images for my question since low reputation.

I use the ffmpeg function to convert the decoded frame, from YUV to RGB24, but the color and resulted image is distorted seriously. Following is my code snip, the frame width and height is (176, 144)

len = avcodec_decode_video2(c, picture, &got_picture, &avpkt);
    if (got_picture) {
            //...

    AVFrame *pFrameRGB = avcodec_alloc_frame();
    // Determine required buffer size and allocate buffer
    int numBytes=avpicture_get_size(PIX_FMT_RGB24, c->width, c->height);
    uint8_t *buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
    avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24, c->width, c->height);

    struct SwsContext *img_convert_ctx = sws_getContext(c->width, c->height, PIX_FMT_YUV420P, c->width, c->height, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);
    sws_scale(img_convert_ctx, picture->data, picture->linesize, 0, picture->height, pFrameRGB->data, pFrameRGB->linesize);
    sws_freeContext(img_convert_ctx);
    // Save the frame to disk
    if(++frame<=5)
        SaveFrame(pFrameRGB, c->width, c->height, frame);
ThomasChang
  • 11
  • 1
  • 3

2 Answers2

0

If I change to convert to ARGB, the result is fine @@.

ThomasChang
  • 11
  • 1
  • 3
0

Perhaps you accidentally chose PIX_FMT_BGR24 when you meant PIX_FMT_RGB24?

struct SwsContext *img_convert_ctx = sws_getContext(c->width, c->height, 
    PIX_FMT_YUV420P, c->width, c->height, PIX_FMT_RGB24, SWS_BICUBIC, 
    NULL, NULL, NULL);
Nate
  • 93
  • 2
  • 9