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

📄 decore.c

📁 代码实现了基于ARM7的MPEG-4视频解码器
💻 C
字号:
//***********************************************
//File name: decore.c
//Author:    Anna
//Date:
//***********************************************

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "vars.h"
#include "decore.h"

#define VOP_START_CODE	0x1b6


int decore(unsigned long handle, unsigned long dec_opt)
{
  switch (dec_opt)
  {
     case DEC_OPT_MEMORY_REQS:
      {
        
        int coded_y_size = ((x_dim + 64) * (y_dim + 64));
		int coded_c_size = (((x_dim>>1) + 64) * ((y_dim>>1) + 64));
		int display_y_size = (x_dim * y_dim);
		int display_c_size = ((x_dim * y_dim) >> 2);
		int edged_size = coded_y_size + (2 * coded_c_size);
		int display_size = display_y_size + (2 * display_c_size);
      
        mp4_edged_ref_buffers_size = edged_size;
		mp4_edged_for_buffers_size = edged_size;
		mp4_display_buffers_size = display_size;
        mp4_state_size = 703544;
		mp4_tables_size = 11332;
		mp4_stream_size = 2216;
      
        return DEC_OK;
      }
      break;
      
      case DEC_OPT_INIT:
      {
        decore_init(x_dim, y_dim); // init decoder resources
        return DEC_OK;
      }
      break;
      
      default:
      {
        // DEC_FRAME *dec_frame = (DEC_FRAME *) param1;

		 if (decore_frame(bmp,stride,render_flag))
			
			 return DEC_OK;
		  else 
			 return DEC_EXIT;
      }
      
      break;
  }
  
}

static int decore_init(int hor_size, int ver_size)
{
    char *infilename = "news_300.avi";
   // char *infilename="foreman.avi";
   // char *infilename = "carphone.avi";
  
 //  mp4_state = (MP4_STATE *) buffers.mp4_state;
 //  mp4_tables = (MP4_TABLES *) buffers.mp4_tables;
 //  ld = (MP4_STREAM *) buffers.mp4_stream;
  
   if((infile=fopen(infilename,"rb"))==NULL)
    {
    printf("Input file %s not found\n",infilename);
    exit(91);
    }
    
    initbits (NULL, 0);
    
    //read first vol and vop
    width=hor_size;
    height=ver_size;
    
    quant_precision=5;
    bits_per_pixel=8;
  
    quant_type=0;
    
    time_increment_resolution = 15;
    complexity_estimation_disable = 1;
    
    decore_alloc (8);
    
    return 1;
	

}

int decore_alloc(int n)
{
  picnum = 0;
  mb_xsize = width / 16;
  mb_ysize = height / 16;
  mba_size = mb_xsize * mb_ysize;
  
  // set picture dimension global vars
   {
		horizontal_size = width;
		vertical_size = height;

		mb_width = horizontal_size / 16;
		mb_height = vertical_size / 16;

		coded_picture_width = horizontal_size + 64 ;
		coded_picture_height =vertical_size + 64;
		chrom_width = coded_picture_width >> 1;
		chrom_height =coded_picture_height >> 1;
   
    printf("%d,",horizontal_size); //for debug
  
  }  
  
  //init decoder
  initdecoder (8);
  
  return 1;
  
}

int decore_frame(unsigned char *bmp, unsigned int stride, int render_flag)
	
{
  
  _SetPrintCond(0,1000,0,1000);
  _Print("- Picture %d\r",picnum);
   
   readbefvol(8);  
   
   getvolhdr(8);
   
   if (! getvophdr(8)) // read vop header
		return 0;
		
 get_mp4picture(bmp, stride, render_flag); // decode vop	
 picnum++;
 
 /*******/ 

	next_start_code();

/*read bits before vop */  //Anna+
 do
 {   
    vop_notbeh_vol=0;
	vop_flag2 = 0;
	vop_if_flush = 0;
	bef_vop_value = showbits(8);
	if(bef_vop_value==0x30)
	{
		flushbits(8);
        bef_vop_value = showbits(8);
		if(bef_vop_value==0x30||bef_vop_value==0x31)
		{
			if(bef_vop_value==0x30)
			{
			flushbits(8);
           bef_vop_value = showbits(8);
			if(bef_vop_value==0x64)
			{
				flushbits(8);
				bef_vop_value = showbits(8);
				if(bef_vop_value==0x63||bef_vop_value==0x62)
				{
                    vop_if_flush = 1;
					if(bef_vop_value==0x63)
					{
						flushbits(8);
						flushbits(32);
						bef_vop_value = showbits(32);
						if(bef_vop_value==VOP_START_CODE)
						{
                           vop_notbeh_vol=1;
                           getvophdr (8);
					   	   get_mp4picture(bmp, stride, render_flag); // decode vop
	                       picnum++;
                           next_start_code();
						}
					}
					if(bef_vop_value==0x62)
					{
						flushbits(8);
						flushbits(32);
						bef_vop_value = showbits(32);
						if(bef_vop_value==0x100)
						{
                           vop_flag2 = 1;
						   flushbits(32);
                           bef_vop_value = showbits(32);
						}

					}
				}
				
			}
			}
         if(bef_vop_value==0x31)
			{
			flushbits(8);
            bef_vop_value = showbits(8);
			if(bef_vop_value==0x64)
			{
				flushbits(8);
				bef_vop_value = showbits(8);
				if(bef_vop_value==0x63||bef_vop_value==0x62)
				{
                    vop_if_flush = 1;
					if(bef_vop_value==0x63)
					{
						flushbits(8);
						flushbits(32);
						bef_vop_value = showbits(32);
						if(bef_vop_value==VOP_START_CODE)
						{
                           vop_notbeh_vol=1;
                           getvophdr (8);
					   	   get_mp4picture(bmp, stride, render_flag); // decode vop
	                       picnum++;
						   next_start_code();
						}
					}
					if(bef_vop_value==0x62)
					{
						flushbits(8);
						flushbits(32);
						bef_vop_value = showbits(32);
						if(bef_vop_value==0x100)
						{
                           vop_flag2 = 1;
						   flushbits(32);
                           bef_vop_value = showbits(32);
						}

					}
				}
				
			}
			}

		}
}
if(vop_if_flush !=1)
{
  flushbits(8);
}

}
while (vop_flag2 != 1);
    
	return 1;
}

/***/
int main()
{
    char *infilename = "news_300.avi";
   //  char *infilename = "foreman.avi";
   // char *infilename = "carphone.avi";
   
   char outputfilename[256]="Test000.raw";
     
   FILE *GetFile;
  
  // DEC_MEM_REQS decMemReqs;
  // DEC_PARAM decParam;
 
   if((GetFile=fopen(infilename,"rb"))==NULL)
	{
		printf("Error!");
		exit(0);
	}
	fseek(GetFile,64,0);
    x_dim=fgetc(GetFile);
    x_dim+=((fgetc(GetFile))*256);
	fseek(GetFile,2,1);
	y_dim=fgetc(GetFile);
    y_dim+=((fgetc(GetFile))*256);
	fclose(GetFile);
   
     printf("%d,",x_dim);
     printf("%d,",y_dim); //for debug 
     
    decore(1, DEC_OPT_MEMORY_REQS);
     
    mp4_edged_ref_buffers = malloc(mp4_edged_ref_buffers_size);
	mp4_edged_for_buffers = malloc(mp4_edged_for_buffers_size);
	mp4_display_buffers = malloc(mp4_display_buffers_size);
	mp4_state = malloc(mp4_state_size);
	mp4_tables = malloc(mp4_tables_size);
	mp4_stream = malloc(mp4_stream_size);
   
  /*  memset(decParam.buffers.mp4_state, 0, decMemReqs.mp4_state_size);
	memset(decParam.buffers.mp4_tables, 0, decMemReqs.mp4_tables_size);
	memset(decParam.buffers.mp4_stream, 0, decMemReqs.mp4_stream_size);

    ((MP4_STATE *) decParam.buffers.mp4_state)->infilename = infilename;
	((MP4_STATE *) decParam.buffers.mp4_state)->outputname = outputfilename;*/
	 outputname = outputfilename;
	
	decore(1, DEC_OPT_INIT);
	
	// decore frames
   {

		bitstream = NULL;
		bmp = NULL;
		length = 0;
		render_flag = 0;

		while ( decore(1, 0) == DEC_OK )
		{
		
		}
	}

  return 1;
}

⌨️ 快捷键说明

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