From 2e862ce71cc800137b6e251ab0a52ef3a077b208 Mon Sep 17 00:00:00 2001 From: Dmitry Kovalev Date: Tue, 28 Jan 2014 11:27:30 -0800 Subject: [PATCH] Adapting postproc example to use new file reading API. Change-Id: Ib3747c81db8cc89b5d7012db557411a3b49712aa --- examples.mk | 2 + examples/postproc.c | 187 +++++++++++++++++++------------------------- 2 files changed, 83 insertions(+), 106 deletions(-) diff --git a/examples.mk b/examples.mk index 6940353f5..57a028a11 100644 --- a/examples.mk +++ b/examples.mk @@ -79,6 +79,8 @@ simple_decoder.SRCS += ivfdec.h ivfdec.c simple_decoder.SRCS += tools_common.h tools_common.c simple_decoder.DESCRIPTION = Simplified decoder loop GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += postproc.c +postproc.SRCS += ivfdec.h ivfdec.c +postproc.SRCS += tools_common.h tools_common.c postproc.GUID = 65E33355-F35E-4088-884D-3FD4905881D7 postproc.DESCRIPTION = Decoder postprocessor control GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += decode_to_md5.c diff --git a/examples/postproc.c b/examples/postproc.c index 0d0d6b59a..4ec2d1f1c 100644 --- a/examples/postproc.c +++ b/examples/postproc.c @@ -39,130 +39,105 @@ // postprocessors. VP8 is one example. The following sample code toggles // postprocessing on and off every 15 frames. -#include #include #include #include + +#include "./ivfdec.h" + #define VPX_CODEC_DISABLE_COMPAT 1 -#include "./vpx_config.h" + #include "vpx/vp8dx.h" #include "vpx/vpx_decoder.h" -#define interface (vpx_codec_vp8_dx()) +#include "./tools_common.h" +#include "./vpx_config.h" -#define IVF_FILE_HDR_SZ (32) -#define IVF_FRAME_HDR_SZ (12) +static const char *exec_name; -static unsigned int mem_get_le32(const unsigned char *mem) { - return (mem[3] << 24)|(mem[2] << 16)|(mem[1] << 8)|(mem[0]); +void usage_exit() { + fprintf(stderr, "Usage: %s \n", exec_name); + exit(EXIT_FAILURE); } -static void die(const char *fmt, ...) { - va_list ap; - - va_start(ap, fmt); - vprintf(fmt, ap); - if(fmt[strlen(fmt)-1] != '\n') - printf("\n"); - exit(EXIT_FAILURE); -} - -static void die_codec(vpx_codec_ctx_t *ctx, const char *s) { - const char *detail = vpx_codec_error_detail(ctx); - - printf("%s: %s\n", s, vpx_codec_error(ctx)); - if(detail) - printf(" %s\n",detail); - exit(EXIT_FAILURE); -} - - int main(int argc, char **argv) { - FILE *infile, *outfile; - vpx_codec_ctx_t codec; - int flags = 0, frame_cnt = 0; - unsigned char file_hdr[IVF_FILE_HDR_SZ]; - unsigned char frame_hdr[IVF_FRAME_HDR_SZ]; - unsigned char frame[256*1024]; - vpx_codec_err_t res; + FILE *infile, *outfile; + vpx_codec_ctx_t codec; + vpx_codec_iface_t *iface; + int frame_cnt = 0; + vpx_video_t *video; + vpx_codec_err_t res; - (void)res; - /* Open files */ - if(argc!=3) - die("Usage: %s \n", argv[0]); - if(!(infile = fopen(argv[1], "rb"))) - die("Failed to open %s for reading", argv[1]); - if(!(outfile = fopen(argv[2], "wb"))) - die("Failed to open %s for writing", argv[2]); + exec_name = argv[0]; - /* Read file header */ - if(!(fread(file_hdr, 1, IVF_FILE_HDR_SZ, infile) == IVF_FILE_HDR_SZ - && file_hdr[0]=='D' && file_hdr[1]=='K' && file_hdr[2]=='I' - && file_hdr[3]=='F')) - die("%s is not an IVF file.", argv[1]); + if (argc != 3) + die("Invalid number of arguments"); - printf("Using %s\n",vpx_codec_iface_name(interface)); - /* Initialize codec */ - res = vpx_codec_dec_init(&codec, interface, NULL, - VPX_CODEC_USE_POSTPROC); - if(res == VPX_CODEC_INCAPABLE) { - printf("NOTICE: Postproc not supported by %s\n", - vpx_codec_iface_name(interface)); - res = vpx_codec_dec_init(&codec, interface, NULL, flags); + if (!(infile = fopen(argv[1], "rb"))) + die("Failed to open %s for reading", argv[1]); + + if (!(outfile = fopen(argv[2], "wb"))) + die("Failed to open %s for writing", argv[2]); + + video = vpx_video_open_file(infile); + if (!video) + die("%s is not a supported input file.", argv[1]); + + iface = get_codec_interface(vpx_video_get_fourcc(video)); + if (!iface) + die("Unknown FOURCC code."); + + printf("Using %s\n", vpx_codec_iface_name(iface)); + + + res = vpx_codec_dec_init(&codec, iface, NULL, VPX_CODEC_USE_POSTPROC); + if (res == VPX_CODEC_INCAPABLE) { + printf("NOTICE: Postproc not supported.\n"); + res = vpx_codec_dec_init(&codec, iface, NULL, 0); + } + + if (res) + die_codec(&codec, "Failed to initialize decoder"); + + while (vpx_video_read_frame(video)) { + vpx_codec_iter_t iter = NULL; + vpx_image_t *img = NULL; + size_t frame_size = 0; + const unsigned char *frame = vpx_video_get_frame(video, &frame_size); + + ++frame_cnt; + + if (frame_cnt % 30 == 1) { + vp8_postproc_cfg_t pp = {0, 0, 0}; + + if (vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp)) + die_codec(&codec, "Failed to turn off postproc"); + } else if (frame_cnt % 30 == 16) { + vp8_postproc_cfg_t pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE, + 4, 0}; + if (vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp)) + die_codec(&codec, "Failed to turn on postproc"); + }; + + // Decode the frame with 15ms deadline + if (vpx_codec_decode(&codec, frame, frame_size, NULL, 15000)) + die_codec(&codec, "Failed to decode frame"); + + while ((img = vpx_codec_get_frame(&codec, &iter)) != NULL) { + vpx_img_write(img, outfile); } - if(res) - die_codec(&codec, "Failed to initialize decoder"); + } - /* Read each frame */ - while(fread(frame_hdr, 1, IVF_FRAME_HDR_SZ, infile) == IVF_FRAME_HDR_SZ) { - int frame_sz = mem_get_le32(frame_hdr); - vpx_codec_iter_t iter = NULL; - vpx_image_t *img; + printf("Processed %d frames.\n", frame_cnt); + if (vpx_codec_destroy(&codec)) + die_codec(&codec, "Failed to destroy codec"); + printf("Play: ffplay -f rawvideo -pix_fmt yuv420p -s %dx%d %s\n", + vpx_video_get_width(video), vpx_video_get_height(video), argv[2]); - frame_cnt++; - if(frame_sz > sizeof(frame)) - die("Frame %d data too big for example code buffer", frame_sz); - if(fread(frame, 1, frame_sz, infile) != frame_sz) - die("Frame %d failed to read complete frame", frame_cnt); + vpx_video_close(video); - #if CONFIG_VP9_DECODER - if(frame_cnt%30 == 1) { - vp8_postproc_cfg_t pp = {0, 0, 0}; - - if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp)) - die_codec(&codec, "Failed to turn off postproc"); - } else if(frame_cnt%30 == 16) { - vp8_postproc_cfg_t pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE, 4, 0}; - - if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp)) - die_codec(&codec, "Failed to turn on postproc"); - }; - #endif - /* Decode the frame with 15ms deadline */ - if(vpx_codec_decode(&codec, frame, frame_sz, NULL, 15000)) - die_codec(&codec, "Failed to decode frame"); - - /* Write decoded data to disk */ - while((img = vpx_codec_get_frame(&codec, &iter))) { - unsigned int plane, y; - - for(plane=0; plane < 3; plane++) { - unsigned char *buf =img->planes[plane]; - - for(y=0; y < (plane ? (img->d_h + 1) >> 1 : img->d_h); y++) { - (void) fwrite(buf, 1, (plane ? (img->d_w + 1) >> 1 : img->d_w), - outfile); - buf += img->stride[plane]; - } - } - } - } - printf("Processed %d frames.\n",frame_cnt); - if(vpx_codec_destroy(&codec)) - die_codec(&codec, "Failed to destroy codec"); - - fclose(outfile); - fclose(infile); - return EXIT_SUCCESS; + fclose(outfile); + fclose(infile); + return EXIT_SUCCESS; }