[FFmpeg-devel] [PATCH] examples/scaling_video: write to rawvideo file
Stefano Sabatini
stefasab at gmail.com
Thu Aug 30 22:45:42 CEST 2012
This is more useful for test purposes. Also allow to specify the name of
the output file.
---
doc/examples/scaling_video.c | 52 +++++++++++++++++++++--------------------
1 files changed, 27 insertions(+), 25 deletions(-)
diff --git a/doc/examples/scaling_video.c b/doc/examples/scaling_video.c
index 144b54a..a53b148 100644
--- a/doc/examples/scaling_video.c
+++ b/doc/examples/scaling_video.c
@@ -50,38 +50,29 @@ static void fill_yuv_image(uint8_t *data[4], int linesize[4],
}
}
-static void save_pgm(const char *filename,
- const uint8_t *data, int linesize, int width, int height)
-{
- FILE *f;
- int i;
-
- f = fopen(filename, "w");
- fprintf(f, "P5\n%d %d\n%d\n", width, height, 255);
- for (i = 0; i < height; i++)
- fwrite(data + i * linesize, 1, width, f);
- fclose(f);
-}
-
int main(int argc, char **argv)
{
uint8_t *src_data[4], *dst_data[4];
int src_linesize[4], dst_linesize[4];
int src_w = 320, src_h = 240, dst_w, dst_h;
- enum PixelFormat src_pix_fmt = PIX_FMT_YUV420P, dst_pix_fmt = PIX_FMT_GRAY8;
- const char *dst_size = argv[1];
+ enum PixelFormat src_pix_fmt = PIX_FMT_YUV420P, dst_pix_fmt = PIX_FMT_RGB24;
+ const char *dst_size = NULL;
+ const char *dst_filename = NULL;
+ FILE *dst_file;
+ int dst_bufsize;
struct SwsContext *sws_ctx;
int i, ret;
- if (argc != 2) {
- fprintf(stderr, "Usage: %s output_size\n"
+ if (argc != 3) {
+ fprintf(stderr, "Usage: %s output_file output_size\n"
"API example program to show how to scale an image with libswscale.\n"
"This program generates a series of pictures, rescales them to the given "
- "<output size> and finally saves the rescaled pictures as PGM files named "
- "like outscale<frame number>.pgm.\n"
+ "output_size and saves them to an output file named output_file\n."
"\n", argv[0]);
exit(1);
}
+ dst_filename = argv[1];
+ dst_size = argv[2];
if (av_parse_video_size(&dst_w, &dst_h, dst_size) < 0) {
fprintf(stderr,
@@ -90,6 +81,12 @@ int main(int argc, char **argv)
exit(1);
}
+ dst_file = fopen(dst_filename, "wb");
+ if (!dst_file) {
+ fprintf(stderr, "Could not open destination file %s\n", dst_filename);
+ exit(1);
+ }
+
/* create scaling context */
sws_ctx = sws_getContext(src_w, src_h, src_pix_fmt,
dst_w, dst_h, dst_pix_fmt,
@@ -109,13 +106,13 @@ int main(int argc, char **argv)
src_w, src_h, src_pix_fmt, 16)) < 0)
goto end;
+ /* buffer is going to be written to rawvideo file, no alignmnet */
if ((ret = av_image_alloc(dst_data, dst_linesize,
- dst_w, dst_h, dst_pix_fmt, 16)) < 0)
+ dst_w, dst_h, dst_pix_fmt, 1)) < 0)
goto end;
+ dst_bufsize = ret;
for (i = 0; i < 100; i++) {
- char filename[1024];
-
/* generate synthetic video */
fill_yuv_image(src_data, src_linesize, src_w, src_h, i);
@@ -123,12 +120,17 @@ int main(int argc, char **argv)
sws_scale(sws_ctx, (const uint8_t * const*)src_data,
src_linesize, 0, src_h, dst_data, dst_linesize);
- /* write Y plane to to output PGM file */
- snprintf(filename, sizeof(filename), "outscale%02d.pgm", i);
- save_pgm(filename, dst_data[0], dst_linesize[0], dst_w, dst_h);
+ /* write scaled image to file */
+ fwrite(dst_data[0], 1, dst_bufsize, dst_file);
}
+ fprintf(stderr, "Scaling succeeded. Play the output file with the command:\n"
+ "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
+ av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename);
+
end:
+ if (dst_file)
+ fclose(dst_file);
av_freep(&src_data[0]);
av_freep(&dst_data[0]);
sws_freeContext(sws_ctx);
--
1.7.5.4
More information about the ffmpeg-devel
mailing list