/** * HEVC Encoder * - Marko Viitanen ( fador at iki.fi ), Tampere University of Technology, Department of Computer Systems. */ /*! \file decmain.c \brief main file for the Decoder \author Marko Viitanen \date 2012-05 This file contains main() function */ /*! \mainpage HEVC Encoder * * \section Coding style * * Coding style is explained in it's own document. * * \section usage_sec Usage * * \subsection encode_subsec Basic Decoding: * Use encmain.exe -i input.yuv -o output.hevc * * \subsection options_subsec All program options: * - -i : input * - -o : output * - -w : frame width * - -h : frame height * - -n : encode only n frames */ /* Suppress some windows warnings */ #ifdef WIN32 #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include "global.h" #include "config.h" #include "encoder.h" #include "cabac.h" #include "picture.h" #include "transform.h" /*! \brief Program main function. \param argc Argument count from commandline \param argv Argument list \return Program exit state */ int main(int argc, char* argv[]) { uint32_t curFrame = 0; config *cfg = NULL; /* Global configuration */ FILE *input = NULL; FILE *output = NULL; FILE *recout = fopen("encrec.yuv","wb"); encoder_control* encoder = (encoder_control*)malloc(sizeof(encoder_control));; /* Handle configuration */ cfg = config_alloc(); /* If problem with configuration, shutdown */ if(!config_init(cfg) || !config_read(cfg,argc,argv)) { fprintf(stderr, "/***********************************************/\r\n"); fprintf(stderr, " * HEVC Encoder v. " VERSION_STRING "*\r\n"); fprintf(stderr, " * Tampere University of Technology 2012 *\r\n"); fprintf(stderr, "/***********************************************/\r\n\r\n"); fprintf(stderr, "Usage:\r\n"); fprintf(stderr, "encmain -i -w -h -o \r\n"); fprintf(stderr, "Optional parameters:\r\n"); fprintf(stderr, " -n : number of frames to decode\r\n"); fprintf(stderr, " -s : number of frames to skip from the beginning\r\n"); config_destroy(cfg); return EXIT_FAILURE; } printf("Input: %s, output: %s\n", cfg->input, cfg->output); printf(" Video size: %dx%d\n", cfg->width, cfg->height); /* Open input file and check that it was opened correctly */ input = fopen(cfg->input, "rb"); if(input == NULL) { fprintf(stderr, "Could not open input file, shutting down!\n"); config_destroy(cfg); return EXIT_FAILURE; } /* Open output file and check that it was opened correctly */ output = fopen(cfg->output, "wb"); if(output == NULL) { fprintf(stderr, "Could not open output file, shutting down!\n"); config_destroy(cfg); return EXIT_FAILURE; } /* Initialization */ init_tables(); init_exp_golomb(4096*8); cabac_init(&cabac); scalinglist_init(); init_encoder_control(encoder, (bitstream*)malloc(sizeof(bitstream))); /* Init bitstream */ bitstream_init(encoder->stream); encoder->stream->buffer_pos = 0; encoder->stream->output = 0; /* Alloc 1MB */ bitstream_alloc(encoder->stream, 1024*1024); /* Config pointer to encoder struct */ encoder->cfg = cfg; /* Set output file */ encoder->output = output; /* Set CABAC output bitstream */ cabac.stream = encoder->stream; /* input init (ToDo: read from commandline / config) */ encoder->bitdepth = 8; encoder->frame = 0; encoder->QP = 22; encoder->in.video_format = FORMAT_420; init_encoder_input(&encoder->in, input, cfg->width, cfg->height); /* Start coding cycle */ while(!feof(input) && (!cfg->frames || curFrame < cfg->frames)) { /* Read one frame from the input */ fread(encoder->in.cur_pic.yData, cfg->width*cfg->height,1,input); fread(encoder->in.cur_pic.uData, cfg->width*cfg->height>>2,1,input); fread(encoder->in.cur_pic.vData, cfg->width*cfg->height>>2,1,input); encode_one_frame(encoder); /* Write reconstructed frame out */ fwrite(encoder->in.cur_pic.yRecData,cfg->width*cfg->height,1,recout); fwrite(encoder->in.cur_pic.uRecData,cfg->width*cfg->height>>2,1,recout); fwrite(encoder->in.cur_pic.vRecData,cfg->width*cfg->height>>2,1,recout); printf("[%d] %c-frame\n", encoder->frame, "IPB"[encoder->in.cur_pic.type%3]); encoder->frame++; } /* Coding finished */ printf(" Processed %d frames\n", encoder->frame-1); fclose(input); fclose(output); fclose(recout); /* Deallocating */ config_destroy(cfg); scalinglist_destroy(); return EXIT_SUCCESS; }