Извлечение изображения видеокадра с помощью libavformat и libswscale дает перевернутое изображение

Я использую следующий код для извлечения кадров изображения, выводимых avcodec_decode_video2(), в файл BMP:

// Convert the image from its native format to RGB
int height = sws_scale(state.sws_ctx, 
             (uint8_t const * const *)state.frame->data,
             state.frame->linesize, 
             0, 
             state.video_codec_ctx->height,
             state.picture.data, 
             state.picture.linesize);

// ..... here BMP header initialization goes ...

// Extract pixels
{
    int y = 0;
    size_t frame_line_size = state.picture.linesize[0];
    uint8_t* bmp_data = &bmp->data[0];
    uint8_t* picture_data = state.picture.data[0];
    while(y < height)
    {
        memcpy(bmp_data, picture_data, image_line_size);
        bmp_data += image_line_size_with_padding;
        picture_data += frame_line_size;
        ++y;
    }
}

Но получается перевернутое изображение:

Результирующее изображение BMP

Может ли кто-нибудь помочь мне понять, что я здесь делаю неправильно?

Информация о видеопотоке:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'testdata/video3.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    title           : video3.mp4
    encoder         : Lavf52.78.3
  Duration: 00:00:07.93, start: 0.000000, bitrate: 1467 kb/s
    Stream #0.0(und): Video: h264 (High), yuv420p, 640x320 [PAR 1:1 DAR 2:1], 1331 kb/s, 29.73 fps, 29.73 tbr, 29734 tbn, 59.47 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, fltp, 127 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Video file 'testdata/video3.mp4' has 236 frames.

У меня есть альтернативный код, который использует libopencv, и он дает правильное изображение из того же видеофайла, но мне нужно добиться правильного эффекта, используя непосредственно библиотеки ffmpeg.

Правильное изображение установлено из того же видеофайла через libopencv


person ivan.ukr    schedule 18.11.2015    source источник
comment
К сожалению, BMP ожидает, что строка 0 будет нижней строкой.   -  person user58697    schedule 19.11.2015
comment
Спасибо, я этого не знал. Так что просто нужно изменить порядок строк.   -  person ivan.ukr    schedule 19.11.2015


Ответы (1)


Итак, вот рабочий код:

// Extract pixels
{
    int y = 0;
    size_t frame_line_size = state.picture.linesize[0];
    uint8_t* bmp_data = &bmp->data[0] + (image_line_size_with_padding * (height - 1));
    uint8_t* picture_data = state.picture.data[0];
    while(y < height)
    {
        memcpy(bmp_data, picture_data, image_line_size);
        bmp_data -= image_line_size_with_padding;
        picture_data += frame_line_size;
        ++y;
    }
}
person ivan.ukr    schedule 21.11.2015