📄 decore.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 + -