diff options
author | Stefano Sabatini <stefasab@gmail.com> | 2012-08-30 22:37:44 +0200 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2012-09-04 11:29:28 +0200 |
commit | 3b34cbce19a8f410130e995c4cf44db1b7bfd532 (patch) | |
tree | 19d15240d502076f2bca4de3e92725aa8e1251f5 /doc | |
parent | 838b1d60a1c29659663ea3471de025b692298365 (diff) | |
download | ffmpeg-3b34cbce19a8f410130e995c4cf44db1b7bfd532.tar.gz |
examples/scaling_video: write to rawvideo file
This is more useful for testing purposes. Also allow to specify the name
of the output file.
Diffstat (limited to 'doc')
-rw-r--r-- | doc/examples/Makefile | 2 | ||||
-rw-r--r-- | doc/examples/scaling_video.c | 52 |
2 files changed, 28 insertions, 26 deletions
diff --git a/doc/examples/Makefile b/doc/examples/Makefile index e8aab57d69..36c949af56 100644 --- a/doc/examples/Makefile +++ b/doc/examples/Makefile @@ -30,7 +30,7 @@ muxing: LDLIBS += -lm all: $(OBJS) $(EXAMPLES) clean-test: - $(RM) test*.pgm test.h264 test.mp2 test.sw test.mpg outscale*.pgm + $(RM) test*.pgm test.h264 test.mp2 test.sw test.mpg clean: clean-test $(RM) $(EXAMPLES) $(OBJS) diff --git a/doc/examples/scaling_video.c b/doc/examples/scaling_video.c index 684d2ca2aa..686af0cc72 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, @@ -111,15 +108,15 @@ int main(int argc, char **argv) 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) { fprintf(stderr, "Could not allocate destination image\n"); 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); @@ -127,12 +124,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); |