[Libav-user] How to get interleaved raw RGB data from AVFrame objects?
B Aleck
aleck099 at outlook.com
Sun Apr 10 06:53:04 EEST 2022
"interleaved raw RGB data" means:
<-- width-->
RGBRGBRGBRGB |
RGBRGBRGBRGB height
RGBRGBRGBRGB |
We can show that image by
$ ffplay -f rawvideo -pixel_format rgb24 -video_size WxH input.rgb
I wrote the following code trying to save an AVFrame object to file
f: the frame to save
px: pixel_format of f
width: width of target image
height: height of target image
fn: file name of target image
```
void save_rgb(const AVFrame* f, enum AVPixelFormat px, int width, int height, const char* fn) {
struct SwsContext* sws = sws_getContext(f->width, f->height, px,
width, height, AV_PIX_FMT_RGB24, SWS_BILINEAR, NULL, NULL, NULL);
size_t imbufsize = width * height * 3;
unsigned char* im_buf = (unsigned char*) malloc(imbufsize);
uint8_t *rdata[4] = {im_buf, 0, 0, 0};
int rlinesize[4] = {width, 0, 0, 0};
sws_scale(sws, (const uint8_t* const*)(f->data), f->linesize, 0, f->height,
rdata, rlinesize);
FILE* fobj = fopen(fn, "wb");
if (fobj) {
fwrite(im_buf, 1, imbufsize, fobj);
fclose(fobj);
}
free(im_buf);
sws_freeContext(sws);
}
```
But it gave strange output:
https://imgur.com/l0pJFFI
(What I expected is: https://imgur.com/nqaDp0r)
What's wrong with my code?
Reproduce steps:
$ git clone https://github.com/aleck099/santest
$ cd santest
$ gcc minimal.c -lavformat -lavcodec -lswscale -lavutil
$ ./a.out example.mp4 out.yuv out.rgb
More information about the Libav-user
mailing list