⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp4emain.c

📁 Intel提供的在PCA(例如Sitsang开发板)使用IPP4.0库的MPEG-4编码源程序
💻 C
字号:
/******************************************************************************//               INTEL CORPORATION PROPRIETARY INFORMATION//  This software is supplied under the terms of a license agreement or//  nondisclosure agreement with Intel Corporation and may not be copied//  or disclosed except in accordance with the terms of that agreement.//        Copyright (c) 2003 Intel Corporation. All Rights Reserved.////  Description:    Encoder main entry function of MPEG-4 video encoder sample//                  code for Intel(R) Integrated Performance Primitives.//  Functions List://		main()//		print_help_infor()//		parse_command_line_mpeg4()******************************************************************************/#include <memory.h>#include <string.h>#include <stdlib.h>#include "sampmp4.h"/*****************************************************************************// Name:             print_help_infor// Description:      Print help information about the encoder usage.//// Returns://                   None*****************************************************************************/void print_help_infor(){    printf("Usage: MPEG4Decoder.exe  infile  outfile  [options]\n"           "       infile :  .yuv input filename\n"           "       outfile:  .cmp output filename\n"           "       options:	 -vi xx  vol verison id;\n"           "                         (xx = 1 or 2, default = 2)\n"           "                 -fw xx  frame width in pixel;\n"           "                         (default = 176)\n"           "                 -fh xx  frame height in pixel;\n"           "                         (default = 144)\n"           "                 -fr xx  frame rate in frames per second;\n"           "                         (default = 25)\n"           "                 -cr xx  source frame color format;\n"           "                         (xx = 0, default = 0 for YUV4:1:1)\n"           "                 -qt xx  quantisation method;\n"           "                         (xx = 1 or 2, default = 1)\n"           "                 -qp xx  initial quantiser step;\n"           "                         (xx = 1 - 31, default = 16)\n"           "                 -th xx  intra dc vlc threshold;\n"           "                         (xx = 0 - 7, default = 0)\n"           "                 -iv xx  ivop interval in number of pvops in between;\n"           "                         (default = -1 for only the 1st frame is ivop)\n"           "                 -sr xx  search range for motion estimation in pixel;\n"           "                         (xx = 1 - 1023, default = 15)\n"           "                 -us xx  use src data or not for motion estimation;\n"           "                         (xx = 0 or 1, default = 0)\n"           "                 -hp     for help information;\n");    return;}/******************************************************************************// Name:             parse_command_line_mpeg4// Description:      Parse command line to get encoder configuration options.//// Input Arguments://      argc         Number of arguments passed from main entry//      argv         Array of arguments passed from main entry// Output Arguments://      enc_config   Pointer to structure to store encoder configuration//                   parameters.//      fpin_ptr     Pointer to the input .cmp file stream handle to be opened//      fpout_ptr    Pointer to the output .yuv file stream handle to be opened//// Returns://      None******************************************************************************/sample_status parse_command_line_mpeg4(int argc, char** argv, mp4_enc_params *enc_config, FILE **fpin_ptr, FILE **fpout_ptr){    FILE *fpin = NULL, *fpout = NULL;    int   i, tmp;    /* argument check */    if (3 > argc) {        print_help_infor();		return SAMPLE_STATUS_BADARG_ERR;    }        /* open input .yuv file handle */    fpin = fopen(argv[1], "rb");    if (!fpin) {        printf("Can't open input .yuv file!\n");        return SAMPLE_STATUS_BADARG_ERR;    } else {        *fpin_ptr = fpin;    }    /* open output .cmp file handle */    fpout = fopen(argv[2], "wb");    if (!fpout) {        printf("Can't open output .cmp file!\n");        return SAMPLE_STATUS_BADARG_ERR;    } else {        *fpout_ptr = fpout;    }    /* fill default configurations */    enc_config->vol_verid     = 2;    enc_config->vol_width     = 176;    enc_config->vol_height    = 144;    enc_config->frame_rate    = 25;    enc_config->intra_dc_thr  = 0;    enc_config->ivop_interval = -1;    enc_config->quant_type    = Q_MPEG4;    enc_config->vop_quant     = 16;    enc_config->search_range  = 15;    enc_config->use_src_me    = 0;    enc_config->color_format  = SAMPLE_YCbCr411;            /* parse encoder configuration params */    for (i = 3; i < argc; i++) {        /* vol version id */        if (!strcmp(argv[i], "-vi")) {                        tmp = atoi(argv[++i]);            if ((1 != tmp) && (2 != tmp)) {                printf("Warning: vol version id must be equal to 1 or 2!\n");                return SAMPLE_STATUS_BADARG_ERR;            } else {                enc_config->vol_verid = tmp;            }        } else if (!strcmp(argv[i], "-fw")) { /* vol width */                        tmp = atoi(argv[++i]);            if (0 >= tmp) {                printf("Warning: vol width must be positive!\n");                return SAMPLE_STATUS_BADARG_ERR;            } else {                enc_config->vol_width = tmp;            }        } else if (!strcmp(argv[i], "-fh")) { /* vol height */                        tmp = atoi(argv[++i]);            if (0 >= tmp) {                printf("Warning: vol height must be positive!\n");                return SAMPLE_STATUS_BADARG_ERR;            } else {                enc_config->vol_height = tmp;            }        } else if(!strcmp(argv[i], "-cr")) {  /* source color format */            tmp = atoi(argv[++i]);            if (0 != tmp) {                printf("Warning: source pic color format must be YUV4:1:1\n");                return SAMPLE_STATUS_NOTSUPPORTED_ERR;            } else {                enc_config->color_format = SAMPLE_YCbCr411;            }        } else if (!strcmp(argv[i], "-qt")) {  /* quantisation method */                        tmp = atoi(argv[++i]);            if ((1 != tmp) && (2 != tmp)) {                printf("Warning: quantisation type must be equal to 1 or 2!\n");                return SAMPLE_STATUS_BADARG_ERR;            } else {                enc_config->quant_type = (tmp == 1) ? Q_MPEG4 : Q_H263;            }        } else if (!strcmp(argv[i], "-qp")) {  /* initial quantiser */                        tmp = atoi(argv[++i]);            if ((31 < tmp) || (1 > tmp)) {                printf("Warning: quantiser must be within the range of [1,31]!\n");                return SAMPLE_STATUS_BADARG_ERR;            } else {                enc_config->vop_quant = tmp;            }        } else if (!strcmp(argv[i], "-th")) {  /* intra dc vlc threshold */            tmp = atoi(argv[++i]);            if ((7 < tmp) || (0 > tmp)) {                printf("Warning: intra dc vlc threshold must be within the range of [0, 7]!\n");                return  SAMPLE_STATUS_BADARG_ERR;            } else {                enc_config->intra_dc_thr = tmp;            }        } else if (!strcmp(argv[i], "-iv")) { /* ivop interval */                        tmp = atoi(argv[++i]);            enc_config->ivop_interval = (0 > tmp) ? -1 : tmp;                } else if (!strcmp(argv[i], "-sr")) { /* search range in me */                        tmp = atoi(argv[++i]);                        if ((1023 < tmp) || (1 > tmp)) {                printf("Warning: search range must be within the range of [1, 1023]!\n");                return SAMPLE_STATUS_BADARG_ERR;            } else {                enc_config->search_range = tmp;            }        } else if (!strcmp(argv[i], "-us")) { /* use src raw data in me */            tmp = atoi(argv[++i]);            if ((0 != tmp) && (1 != tmp)) {                printf("Warning: whether use src data or not in motion estimation must be equal to 1 or 0!\n");                return SAMPLE_STATUS_BADARG_ERR;            } else {                enc_config->use_src_me = tmp;            }        } else if (!strcmp(argv[i], "-fr")) { /* frame rate */                        enc_config->frame_rate = atoi(argv[++i]);        }        else {            print_help_infor();            return SAMPLE_STATUS_ERR;        }    }        /* count the number of frames in source file */    fseek(fpin, 0, SEEK_END);    enc_config->num_frames = ftell(fpin) / (enc_config->vol_width        * enc_config->vol_height * 3 / 2);    if (-1 == enc_config->ivop_interval) {        enc_config->ivop_interval = enc_config->num_frames;    }    fseek(fpin, 0, SEEK_SET);    return SAMPLE_STATUS_NOERR;}/*****************************************************************************// Name:             main// Description:      Entry function for MPEG4 baseline encoder//// Returns:          0:       encoding okay//                   others:  encoding fail*****************************************************************************/int main(int argc, char** argv){    mp4_enc_state    enc_state;    mp4_enc_params   enc_config;    sample_bitstream stream_buf;    sample_status    ret_code;    int              buf_size, i;    FILE             *fpin;    FILE             *fpout;        /* parse command line to obtain encoder configuration options */    ret_code = parse_command_line_mpeg4(argc, argv, &enc_config, &fpin, &fpout);    if (SAMPLE_STATUS_NOERR != ret_code) {        return -1;    }    /* init the encoder state */    ret_code = encoder_init_alloc_mpeg4(&enc_config, &enc_state);    if (SAMPLE_STATUS_NOERR != ret_code) {        return -1;    }    /* init output video bitstream buffer */    buf_size = enc_state.frame_dimension.width        * enc_state.frame_dimension.height * 3;    ret_code = init_output_video_buffer(&stream_buf, buf_size);    if (SAMPLE_STATUS_NOERR != ret_code) {        encoder_free_mpeg4(&enc_state);        return -1;    }      /* create vo and vol header */    create_voandvol_header_mpeg4(&stream_buf, &enc_state);    dump_video_buffer(&stream_buf, fpout);    for (i = 0; i < enc_config.num_frames; i++) {        load_extend_picture(fpin, enc_state.info_pic);        ret_code = encode_mpeg4(&stream_buf, &enc_state);                switch (ret_code) {        case SAMPLE_STATUS_NOERR:            printf("Frame encoding ... ... %d\r", i);            dump_video_buffer(&stream_buf, fpout);            break;        default:            i = enc_config.num_frames;            break;        }    }    if (SAMPLE_STATUS_NOERR == ret_code) {        printf("Everything is OK!\n");    }    release_output_video_buffer(&stream_buf);    encoder_free_mpeg4(&enc_state);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -