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

📄 mp4dmain.c

📁 Intel提供的在Sitsang等嵌入式开发平台上使用Linux操作系统
💻 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:    Decoder main entry function of MPEG-4 video decoder sample//                  code for Intel(R) Integrated Performance Primitives.//  Functions List://		main()//		output_frame_mpeg4()******************************************************************************/#include "sampmp4.h"/******************************************************************************// Name:                output_frame_mpeg4// Description:         Dump the decoded yuv plane to the appointed output file//// Input Parameters://      picture         Pointer to the decoded yuv plane//      fpout           Output file handle// Output Parameters://      fpout           The updated output file handle//// Note://   the fpout handle shouldn't be NULL.//******************************************************************************/void output_frame_mpeg4 (FILE *fpout, sample_picture *picture) {    int     i, step;    Ipp8u   *dst_y, *dst_u, *dst_v;    dst_y = picture->pic_plane[0];    dst_u = picture->pic_plane[1];    dst_v = picture->pic_plane[2];        /* Y plane */    step = picture->pic_plane_step[0];    for(i = 0; i<picture->pic_height; i++) {        fwrite(dst_y, sizeof(char), picture->pic_width, fpout);        dst_y += step;              }    /* U plane */    step = picture->pic_plane_step[1];    for(i = 0; i<picture->pic_height/2; i++) {        fwrite(dst_u, sizeof(char), picture->pic_width/2, fpout);        dst_u += step;          }    /* V plane */    step = picture->pic_plane_step[2];    for(i = 0; i<picture->pic_height/2; i++) {        fwrite(dst_v, sizeof(char), picture->pic_width/2, fpout);        dst_v += step;    }    }/*****************************************************************************// Name:             main// Description:      Entry function for MPEG4 simple profile decoder//// Returns:          0:       decoding okay//                   others:  decoding fail*****************************************************************************/int main (int argc, char *argv[]){    FILE                *fpin = NULL, *fpout = NULL;        sample_picture      pic;    sample_bitstream    stream_buf;    mp4_dec_state       dec_state;    sample_status       ret_code;       /* return value */    int                 end_flag = 0, last_frame_flag = 0;        /* argument check */    if (3 > argc)    {        printf("Usage: MPEG4Decoder.exe   infile   outfile!\n"               "       infile : .cmp input  filename\n"               "       outfile: .yuv output filename\n");        return -1;    }        /* open input .cmp file handle */    fpin = fopen(argv[1], "rb");    if (!fpin)    {        printf("Can't open input cmp file!\n");        return -1;    }    /* open output .yuv file handle */    fpout = fopen(argv[2], "wb");    if (!fpout)    {        printf("Can't open output yuv file!\n");        return -1;    }        /* init input video bitstream buffer */    ret_code = init_input_video_buffer(&stream_buf);    if (ret_code != SAMPLE_STATUS_NOERR) {        printf("Init input video bitstream buffer error!\n");        return -1;    }    /* load bitstream into buffer for the 1st time */    ret_code = load_video_buffer(&stream_buf, fpin);    if (ret_code != SAMPLE_STATUS_NOERR) {        release_input_video_buffer(&stream_buf);        printf ("Empty buffer error!\n");        return -1;    }    /* init decoder state struct */    ret_code = decoder_init_alloc_mpeg4(&stream_buf, &dec_state);        if (ret_code != SAMPLE_STATUS_NOERR) {        release_input_video_buffer(&stream_buf);        printf ("Init decoder state error!\n");        return -1;    }    /* decoding loop */    while (!end_flag)     {        /* decode video stream frame by frame */        ret_code = decode_mpeg4(&stream_buf, &pic, &dec_state);        switch (ret_code)        {        /* one frame has been decoded successfully */        case SAMPLE_STATUS_NOERR:            output_frame_mpeg4(fpout, &pic);            /* if it's the last frame, exit the decoding loop */            if (1 == last_frame_flag) {                end_flag = 1;            }            break;                /* next sync code is not found in the buffer */        case SAMPLE_STATUS_SYNCNOTFOUND_ERR:            /* not end of input .cmp file stream */            if (!feof(fpin)) {                /* load bitstream into buffer to fill it up */                if (SAMPLE_STATUS_NOERR                    != load_video_buffer(&stream_buf, fpin)) {                    /* no new bits loaded, this could happen if the buffer                    // length is less than one frame of raw stream or the                     // sync code is missing at all */                    end_flag = 1;                                   };            } else {                /* to decode the last frame in buffer */                last_frame_flag = 1;                /* insert sync code in the end of the stream to provide error                // protection boundary for the last frame */                insert_sc_mpeg4 (&stream_buf);            }            break;        default:            /* exceptions */            end_flag = 1;        }    }    /* print the final decoding state */    switch (ret_code)    {    case SAMPLE_STATUS_NOERR:        printf("Everything is okay!\n");        break;    case SAMPLE_STATUS_ERR:        printf("Unknown/Unspecified error!\n");        break;    case SAMPLE_STATUS_NOMEM_ERR:        printf("Memory allocation failed!\n");        break;    case SAMPLE_STATUS_BADARG_ERR:        printf("Bad argument error!\n");        break;    case SAMPLE_STATUS_SYNCNOTFOUND_ERR:        printf("Miss synchronize code!\n");        break;    case SAMPLE_STATUS_INPUT_ERR:        printf("Wrong input parameter!\n");        break;    case SAMPLE_STATUS_NOTSUPPORTED_ERR:        printf("Not support in current version yet!\n");        break;    default:        printf("Out of control!\n");        break;    }    /* free decoder state struct working buffer */    decoder_free_mpeg4(&dec_state);    /* free input video bitstream buffer */    release_input_video_buffer(&stream_buf);    /* close the input and output file handle */    fclose (fpout);     fclose (fpin);    return (SAMPLE_STATUS_NOERR == ret_code) ? 0 : -1;}

⌨️ 快捷键说明

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