mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-24 00:02:52 +00:00
examples/scaling_video: write to rawvideo file
This is more useful for testing purposes. Also allow to specify the name of the output file.
This commit is contained in:
parent
838b1d60a1
commit
3b34cbce19
@ -30,7 +30,7 @@ muxing: LDLIBS += -lm
|
|||||||
all: $(OBJS) $(EXAMPLES)
|
all: $(OBJS) $(EXAMPLES)
|
||||||
|
|
||||||
clean-test:
|
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
|
clean: clean-test
|
||||||
$(RM) $(EXAMPLES) $(OBJS)
|
$(RM) $(EXAMPLES) $(OBJS)
|
||||||
|
@ -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)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
uint8_t *src_data[4], *dst_data[4];
|
uint8_t *src_data[4], *dst_data[4];
|
||||||
int src_linesize[4], dst_linesize[4];
|
int src_linesize[4], dst_linesize[4];
|
||||||
int src_w = 320, src_h = 240, dst_w, dst_h;
|
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;
|
enum PixelFormat src_pix_fmt = PIX_FMT_YUV420P, dst_pix_fmt = PIX_FMT_RGB24;
|
||||||
const char *dst_size = argv[1];
|
const char *dst_size = NULL;
|
||||||
|
const char *dst_filename = NULL;
|
||||||
|
FILE *dst_file;
|
||||||
|
int dst_bufsize;
|
||||||
struct SwsContext *sws_ctx;
|
struct SwsContext *sws_ctx;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
if (argc != 2) {
|
if (argc != 3) {
|
||||||
fprintf(stderr, "Usage: %s output_size\n"
|
fprintf(stderr, "Usage: %s output_file output_size\n"
|
||||||
"API example program to show how to scale an image with libswscale.\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 "
|
"This program generates a series of pictures, rescales them to the given "
|
||||||
"<output size> and finally saves the rescaled pictures as PGM files named "
|
"output_size and saves them to an output file named output_file\n."
|
||||||
"like outscale<frame number>.pgm.\n"
|
|
||||||
"\n", argv[0]);
|
"\n", argv[0]);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
dst_filename = argv[1];
|
||||||
|
dst_size = argv[2];
|
||||||
|
|
||||||
if (av_parse_video_size(&dst_w, &dst_h, dst_size) < 0) {
|
if (av_parse_video_size(&dst_w, &dst_h, dst_size) < 0) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@ -90,6 +81,12 @@ int main(int argc, char **argv)
|
|||||||
exit(1);
|
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 */
|
/* create scaling context */
|
||||||
sws_ctx = sws_getContext(src_w, src_h, src_pix_fmt,
|
sws_ctx = sws_getContext(src_w, src_h, src_pix_fmt,
|
||||||
dst_w, dst_h, dst_pix_fmt,
|
dst_w, dst_h, dst_pix_fmt,
|
||||||
@ -111,15 +108,15 @@ int main(int argc, char **argv)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* buffer is going to be written to rawvideo file, no alignmnet */
|
||||||
if ((ret = av_image_alloc(dst_data, dst_linesize,
|
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");
|
fprintf(stderr, "Could not allocate destination image\n");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
dst_bufsize = ret;
|
||||||
|
|
||||||
for (i = 0; i < 100; i++) {
|
for (i = 0; i < 100; i++) {
|
||||||
char filename[1024];
|
|
||||||
|
|
||||||
/* generate synthetic video */
|
/* generate synthetic video */
|
||||||
fill_yuv_image(src_data, src_linesize, src_w, src_h, i);
|
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,
|
sws_scale(sws_ctx, (const uint8_t * const*)src_data,
|
||||||
src_linesize, 0, src_h, dst_data, dst_linesize);
|
src_linesize, 0, src_h, dst_data, dst_linesize);
|
||||||
|
|
||||||
/* write Y plane to to output PGM file */
|
/* write scaled image to file */
|
||||||
snprintf(filename, sizeof(filename), "outscale%02d.pgm", i);
|
fwrite(dst_data[0], 1, dst_bufsize, dst_file);
|
||||||
save_pgm(filename, dst_data[0], dst_linesize[0], dst_w, dst_h);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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:
|
end:
|
||||||
|
if (dst_file)
|
||||||
|
fclose(dst_file);
|
||||||
av_freep(&src_data[0]);
|
av_freep(&src_data[0]);
|
||||||
av_freep(&dst_data[0]);
|
av_freep(&dst_data[0]);
|
||||||
sws_freeContext(sws_ctx);
|
sws_freeContext(sws_ctx);
|
||||||
|
Loading…
Reference in New Issue
Block a user