demux matlab代码,mp4文件格式解析,为demux准备的代码

//filename mp4_boxes.cpp

#include#include#include#include#include#include#include"mp4_boxes.h"#ifndef RELEASE#defineRELEASE 1#endif#ifndef VARIABLES#defineVARIABLES                               \intk=0;                                  \

unsignedcharp[5];                         \intinner_size=0;#endifstaticstructmp4_moov_box moov;/*final box*/intmp4_read_mvhd_box(FILE*f,intsize)//level 3{

printf("\t+%s\n","mvhd");

VARIABLES;intlevel_4_box_size=0;

mp4_mvhd_box mvhd;

memset(&mvhd,0,sizeof(mvhd));

mvhd.size=size;

mvhd.type=('m'|'v'<<8|'h'<<16|'d'<<24);

mvhd.version=read_uint8(f);//1fread(mvhd.flags,sizeof(mvhd.flags),1, f);//3mvhd.creation_time=read_uint32_lit(f);//4mvhd.modification_time=read_uint32_lit(f);//4mvhd.timescale=read_uint32_lit(f);//4mvhd.duration=read_uint32_lit(f);//4mvhd.rate=read_uint32_lit(f);//4mvhd.volume=read_uint16_big(f);//2fread(&mvhd.reserved1,sizeof(mvhd.reserved1),1, f);//2fread(&mvhd.reserved2,sizeof(mvhd.reserved2),1, f);//8fread(mvhd.matrix,sizeof(mvhd.matrix),1, f);//36fread(mvhd.pre_defined,sizeof(mvhd.pre_defined),1, f);//24mvhd.next_track_id=read_uint32_lit(f);//4moov.mvhd=mvhd;

printf("\t\ttimescale: %u\n", moov.mvhd.timescale);

printf("\t\tduration: %u\n", moov.mvhd.duration);

printf("\t\trate: %u\n", moov.mvhd.rate );

printf("\t\tvolume: 0x%x\n", moov.mvhd.volume);

printf("\t\tmatrix:\n");for(inti=0; i<3;++i){

printf("\t\t");for(intj=0; j<3;++j){

printf("%8u", moov.mvhd.matrix[i*3+j]);

}

printf("\n");

}

printf("\t\tnext track id: %u\n", moov.mvhd.next_track_id);

printf("\n");

}/*final box*/structmp4_tkhd_box mp4_read_tkhd_box(FILE*f,intsize)//level 4{

printf("\t\t+%s\n","tkhd");

VARIABLES;

mp4_tkhd_box box;

box.size=size;

box.type=0;

box.version=read_uint8(f);

fread(&box.flags,sizeof(box.flags),1, f);

box.creation_time=read_uint32_lit(f);

box.modification_time=read_uint32_lit(f);

box.track_ID=read_uint32_lit(f);

box.reserved1=read_uint32_lit(f);

box.duration=read_uint32_lit(f);

fread(&box.reserved2,sizeof(box.reserved2),1, f);

box.layer=read_uint16_big(f);

box.alternate_group=read_uint16_big(f);

box.volume=read_uint16_big(f);

box.reserved3=read_uint16_big(f);

fread(&box.matrix,sizeof(box.matrix),1, f);

box.width=read_uint32_lit(f);

box.height=read_uint32_lit(f);//printf("\t\t\tflags: 0x%4x\n", box.flags[2]//| box.flags[1] | box.flags[0]);//printf("\t\t\tcreation time: %u\n", box.creation_time);//printf("\t\t\tmodifaction time: %u\n",//box.modification_time);printf("\t\t\ttrack id: %u\n", box.track_ID);//printf("\t\t\treserved1: 0x%x\n", box.reserved1);printf("\t\t\tduration: %d\n",box.duration);//printf("\t\t\treserved2: 0x%x, 0x%x\n",//box.reserved2[0], box.reserved2[1]);printf("\t\t\tlayer: %d\n",box.layer);

printf("\t\t\talternate group: %d\n", box.alternate_group);

printf("\t\t\tvolume: 0x%x\n", box.volume);//printf("\t\t\treserved3: 0x%x\n", box.reserved3);printf("\t\t\tmatrix:\n");for(inti=0; i<3;++i){

printf("\t\t\t");for(intj=0; j<3;++j){

printf("%8u", box.matrix[i*3+j]);

}

printf("\n");

}//@a mark still don't knowprintf("\t\t\twidth: %u\n",box.width);

printf("\t\t\theight: [%u].[%u]\n",

box.height&0xffff0000>>16,

box.height&0xffff);

printf("\n");returnbox;

}/*container box

(elst)*/structmp4_edts_box mp4_read_edts_box(FILE*f,intsize)

{

printf("\t\t+%s\n","edts");//return mp4_edts_box();}/*final box*/structmp4_mdhd_box mp4_read_mdhd_box(FILE*f,intsize)

{

printf("\t\t\t+mdhd\n");structmp4_mdhd_box box;

VARIABLES;

box.size=size;

box.type=0;

box.version=read_uint8(f);

fread(&box.flags,sizeof(box.flags),1, f);

box.creation_time=read_uint32_lit(f);

box.modification_time=read_uint32_lit(f);

box.timescale=read_uint32_lit(f);

box.duration=read_uint32_lit(f);

box.language=read_uint16_big(f);

box.pre_defined=read_uint16_big(f);//printf("\t\t\t\t\tflags: 0x%x\n", box.flags[2]//| box.flags[1] | box.flags[0]);//printf("\t\t\t\t\tcreation time: %u\n", box.creation_time);//printf("\t\t\t\t\tmodifaction time: %u\n",//box.modification_time);printf("\t\t\t\ttimescale: %u\n", box.timescale);

printf("\t\t\t\tduration: %u\n", box.duration);

printf("\t\t\t\tlanguage: %u\n", box.language);//printf("\t\t\t\tpre-defined: %u\n", box.pre_defined);//printf("\n");returnbox;

}/*filnal box*/structmp4_hdlr_box mp4_read_hdlr_box(FILE*f,intsize)

{

printf("\t\t\t%s\n","+hdlr");structmp4_hdlr_box box;

VARIABLES;

box.size=size;

box.type='h'|'d'<<8|'l'<<16|'r'<<24;

box.version=read_uint8(f);

fread(&box.flags,sizeof(box.flags),1, f);

box.pre_defined=read_uint32_lit(f);

fread(&box.handler_type,sizeof(box.handler_type),1, f);

box.handler_type[4]=0;

fread(&box.reserved,sizeof(box.reserved),1, f);

fread(&inner_size,1,1, f);

box.name=newchar[inner_size+1];for(inti=0; i

fread(&box.name[i],sizeof(unsignedchar),1, f);//printf("\t\t\t\tflags: 0x%x\n",//box.flags[2] | box.flags[1] | box.flags[0]);//printf("\t\t\t\tpre-defined: %d\n", box.pre_defined);printf("\t\t\t\thandler type: %s\n", box.handler_type);//printf("\t\t\t\treserved: 0x%x, 0x%x, 0x%x\n",//box.reserved[0], box.reserved[1], box.reserved[2]);printf("\t\t\t\tname: %s\n", box.name);//I have no idea what//is this using for//printf("\n");returnbox;

}/*final box*/structmp4_vmhd_box*mp4_read_vmhd_box(FILE*f,intsize)

{

printf("\t\t\t\t+%s\n","vmhd");

VARIABLES;

mp4_vmhd_box*box=newmp4_vmhd_box;

box->size=size;

box->type=0;

box->version=read_uint8(f);

fread(&(box->flags),sizeof(box->flags),1, f);

box->graphics_mode=read_uint32_lit(f);

fread(&(box->opcolor),sizeof(box->opcolor),1, f);//printf("\t\t\t\t\tflags: 0x%x\n", box.flags[2]//| box.flags[1] | box.flags[0]);printf("\t\t\t\t\tgraphics mode: %u\n", box->graphics_mode);

printf("\t\t\t\t\topcolor: %u,%u,%u,%u\n",

box->opcolor[0],  box->opcolor[1],

box->opcolor[2],  box->opcolor[3]);//printf("\n");}/*final box*/structmp4_smhd_box*mp4_read_smhd_box(FILE*f,intsize)

{

printf("\t\t\t\t+%s\n","smhd");

mp4_smhd_box box;

box.size=size;

box.type='s'|'m'<<8|'h'<<16|'d'<<24;

box.version=read_uint8(f);

fread(&box.flags,sizeof(box.flags),1, f);

box.balance=read_uint16_big(f);

box.reserved=read_uint16_big(f);//printf("\t\t\t\t\tflags: 0x%x\n", box.flags[2]//| box.flags[1] | box.flags[0]);printf("\t\t\t\t\tbalance: %d,%d\n",

box.balance&0xff00>>8, box.balance&0xff);//printf("\t\t\t\t\treserved: 0x%x\n", box.reserved);//printf("\n");mp4_smhd_box*newbox=newmp4_smhd_box;*newbox=box;returnnewbox;

}structmp4_stts_box mp4_read_stts_box(FILE*f,intsize)//level 8{

printf("\t\t\t\t\t+%s\n","stts");

mp4_stts_box box;

box.size=size;

box.version=read_uint8(f);

fread(box.flags,sizeof(box.flags),1, f);

box.number_of_entries=read_uint32_lit(f);//printf("\t\t\t\t\t\tflags: %u\n",//box.flags[0]|box.flags[1]|box.flags[2]);printf("\t\t\t\t\t\tnumber of entries: %u\n",box.number_of_entries);

printf("\t\t\t\t\t\tentries:\n\t\t\t\t\t\t");

box.time_to_sample_table=newuint32_t[box.number_of_entries];for(inti=0; i

box.time_to_sample_table[i]=read_uint32_lit(f);//printf("%5u ", box.time_to_sample_table[i]);//if(i%16 == 0) printf("\n");}//delete [] box.time_to_sample_table;printf("\n");returnbox;

}/*final box*/structmp4_avcC_box*mp4_read_avcC_box(FILE*f)

{structmp4_avcC_box*ptr=newmp4_avcC_box;

ptr->size=read_uint32_lit(f);

printf("avcC_size:%u\n",ptr->size);

ptr->type=read_uint32_lit(f);if( ptr->type==('a'<<24|'v'<<16|'c'<<8|'C')){

printf("type:avcC\n");

}

ptr->configurationVersion=read_uint8(f);

printf("configurationVersion:%u\n", ptr->configurationVersion);

ptr->AVCProfileIndication=read_uint8(f);

printf("AVCProfileIndication: %x\n", ptr->AVCProfileIndication);

ptr->profile_compatibility=read_uint8(f);

ptr->AVCLevelIndication=read_uint8(f);

ptr->lengthSizeMinusOne=0x3&read_uint8(f);//2 bitprintf("lengthSizeMinusOne:%u\n", ptr->lengthSizeMinusOne);

ptr->numOfSequenceParameterSet=0x1F&read_uint8(f);//5bitprintf("numOfSequenceParameterSet:%x\n", ptr->numOfSequenceParameterSet);

ptr->sps=newmp4_avcC_box::SPS[ptr->numOfSequenceParameterSet];for(inti=0; inumOfSequenceParameterSet;++i ){

ptr->sps[i].sequenceParameterSetLength=read_uint16_lit(f);

printf("sequenceParameterSetLength: %u\n", ptr->sps[i].sequenceParameterSetLength);

ptr->sps[i].sequenceParameterSetNALUnit=newuint8_t[ptr->sps[i].sequenceParameterSetLength];

fread((ptr->sps[i].sequenceParameterSetNALUnit),

(ptr->sps[i].sequenceParameterSetLength),1, f);for(intj=0; jsps[i].sequenceParameterSetLength;++j){

printf("%x", ptr->sps[i].sequenceParameterSetNALUnit[j]);

}

printf("============\n");

}

ptr->numOfPictureParameterSets=read_uint8(f);

printf("numOfPictureParameterSets:%u\n", ptr->numOfPictureParameterSets);

ptr->pps=newmp4_avcC_box::PPS[ptr->numOfPictureParameterSets];for(inti=0; inumOfPictureParameterSets;++i){

ptr->pps[i].pictureParameterSetLength=read_uint16_lit(f);

printf("%d\n", ptr->pps[i].pictureParameterSetLength);

ptr->pps[i].pictureParameterSetNALUnit=newuint8_t[ptr->pps[i].pictureParameterSetLength];

fread(ptr->pps[i].pictureParameterSetNALUnit,

ptr->pps[i].pictureParameterSetLength,1, f);for(intj=0; jpps[i].pictureParameterSetLength;++j){

printf("%x", ptr->pps[i].pictureParameterSetNALUnit[j]);

}

printf("============\n");

}returnptr;

}/*final box

@a special contain a avcC box*/structmp4_avc1_box*mp4_read_avc1_box(FILE*f,intsize)//level 9{

mp4_avc1_box*ptr=newmp4_avc1_box;

ptr->size=size;

ptr->type=(('a'<<24)|('v'<<16)|('c'<<8)|('1'));

fread(ptr->reserved,sizeof(ptr->reserved),1, f);//6ptr->data_reference_index=read_uint16_lit(f);//2ptr->pre_defined=read_uint16_big(f);//2ptr->reserved1=read_uint16_big(f);//2fread(ptr->pre_defined1,sizeof(ptr->pre_defined1),1, f);//3*4ptr->width=read_uint16_lit(f);//2ptr->height=read_uint16_lit(f);//2ptr->horiz_res=read_uint32_lit(f);//4ptr->vert_res=read_uint32_lit(f);//4ptr->reserved2=read_uint32_lit(f);//4ptr->frames_count=read_uint16_lit(f);//2fread(ptr->compressor_name,sizeof(ptr->compressor_name),1, f);//33ptr->bit_depth=read_uint8(f);//1ptr->pre_defined2=read_uint16_big(f);//2//avcC --AVCDecoderConfigurationRecordprintf("-------------------------------------\n");

printf("data_reference_index:%x\n", ptr->data_reference_index);

printf("width:%u\n", ptr->width);

printf("height:%u\n", ptr->height);

printf("frames_count:%x\n", ptr->frames_count);

printf("bit_depth:%u\n", ptr->bit_depth);

printf("pre_defined2: %x\n", ptr->pre_defined2);

ptr->avcC=mp4_read_avcC_box(f);

printf("-------------------------------------\n");returnptr;

}/*final box*/structmp4_mp4a_box*mp4_read_mp4a_box(FILE*f,intsize)//level 9{

printf("\t\t\t\t\t\t+mp4a\n");return0;

}/*container box

(mp4a,avc1)*/structmp4_stsd_box mp4_read_stsd_box(FILE*f,intsize)//level 8{

printf("\t\t\t\t\t+%s\n","stsd");

mp4_stsd_box box;

box.size=size;

box.version=read_uint8(f);

fread(box.flags,sizeof(box.flags),1, f);

box.number_of_entries=read_uint32_lit(f);//printf("\t\t\t\t\t\tflags: %u\n",//box.flags[0]|box.flags[1]|box.flags[2]);printf("\t\t\t\t\t\tnumber of entries: %u\n", box.number_of_entries);

box.sample_description=newSample_description[box.number_of_entries];for(inti=0; i

box.sample_description[i].size=read_uint32_lit(f);

box.sample_description[i].type=read_uint32_lit(f);if( box.sample_description[i].type==(('m'<<24)|('p'<<16)|('4'<<8)|('a'))){

box.sample_description[i].mp4a=mp4_read_mp4a_box(f, box.sample_description[i].size);

box.sample_description[i].avc1=0;

}elseif(box.sample_description[i].type==(('a'<<24)|('v'<<16)|('c'<<8)|('1'))){

box.sample_description[i].avc1=mp4_read_avc1_box(f, box.sample_description[i].size);

box.sample_description[i].mp4a=0;

}

}returnbox;

}/*final box*/structmp4_stss_box mp4_read_stss_box(FILE*f,intsize)//level 8{

printf("\t\t\t\t\t+%s\n","stss");

mp4_stss_box box;

box.size=size;

box.version=read_uint8(f);

fread(box.flags,sizeof(box.flags),1, f);

box.number_of_entries=read_uint32_lit(f);//printf("\t\t\t\t\t\t\tflags: %u\n",//box.flags[0]|box.flags[1]|box.flags[2]);printf("\t\t\t\t\t\tnumber of entries: %u\n",box.number_of_entries);

printf("\t\t\t\t\t\tentries:\n");

box.sync_sample_table=newuint32_t[box.number_of_entries];for(inti=0; i

box.sync_sample_table[i]=read_uint32_lit(f);

printf("%6u", box.sync_sample_table[i]);if( (i+1)%12==0) printf("\n");

}//delete box.sync_sample_table;printf("\n");returnbox;

}/*final box*/structmp4_stsc_box mp4_read_stsc_box(FILE*f,intsize)//level 8{

printf("\t\t\t\t\t+%s\n","stsc");

mp4_stsc_box box;

box.version=read_uint8(f);

fread(&box.flags,sizeof(box.flags),1, f);

box.map_amount=read_uint32_lit(f);

printf("\t\t\t\t\t\tmap-amount: %u\n", box.map_amount);

box.scmap=newmp4_list_t[box.map_amount];

printf("\t\t\t\t\t\tfirst trunk:\tsamples-per-thunk:\tsample-description-ID\n");for(inti=0; i

box.scmap[i].first_chunk_num=read_uint32_lit(f);

box.scmap[i].sample_amount_in_cur_table=read_uint32_lit(f);

box.scmap[i].sample_description_id=read_uint32_lit(f);

printf("\t\t\t\t\t\t%13d", box.scmap[i].first_chunk_num);

printf("\t%13d", box.scmap[i].sample_amount_in_cur_table);

printf("\t%13d\n", box.scmap[i].sample_description_id);

}//delete box.scmap;returnbox;

}/*final box*/structmp4_stsz_box mp4_read_stsz_box(FILE*f,intsize)//level 8{

printf("\t\t\t\t\t+%s\n","stsz");

mp4_stsz_box box;

box.size=size;

box.version=read_uint8(f);

fread(box.flags,sizeof(box.flags),1, f);

box.samples_size_intotal=read_uint32_lit(f);if(box.samples_size_intotal==0){

box.table_size=read_uint32_lit(f);

box.sample_size_table=newuint32_t[box.table_size];//printf("\t\t\t\t\t\tflags: 0x%x\n",//box.flags[0]|box.flags[1]|box.flags[2]);printf("\t\t\t\t\t\tall samples amount: %u\n", box.samples_size_intotal);

printf("\t\t\t\t\t\tsample table size: %u\n", box.table_size);

printf("\t\t\t\t\t\tsmple_size_table:\n");for(inti=0; i

box.sample_size_table[i]=read_uint32_lit(f);

printf("%8u", box.sample_size_table[i]);if((i+1)%10==0) printf("\n");

}

printf("\n");

}returnbox;

}/*final box*/structmp4_stco_box mp4_read_stco_box(FILE*f,intsize)

{

printf("\t\t\t\t\t+%s\n","stco");

mp4_stco_box box;

box.version=read_uint8(f);

fread(box.flags,sizeof(box.flags),1, f);

box.chunk_offset_amount=read_uint32_lit(f);

printf("\t\t\t\t\t\tflags: 0x %x\n",

box.flags[0]|box.flags[1]|box.flags[2]);

printf("\t\t\t\t\t\tchunk offest amount: %u\n",

box.chunk_offset_amount);

printf("\t\t\t\t\t\tchunk offset:\n");

box.chunk_offset_from_file_begin=newuint32_t[box.chunk_offset_amount];for(inti=0; i

box.chunk_offset_from_file_begin[i]=read_uint32_lit(f);

printf("%8x", box.chunk_offset_from_file_begin[i]);if((i+1)%10==0) printf("\n");

}//delete [] box.chunk_offset_from_file_begin;returnbox;

}/*container box

(stsd, stts, stsz|stz2, stsc, stco|co64, ctts, stss)*/structmp4_stbl_box mp4_read_stbl_box(FILE*f,intsize)

{

printf("\t\t\t\t+stbl\n");

mp4_stbl_box box;

VARIABLES;intbox_size=0;intcur_pos=ftell(f) ;do{

fseek(f, cur_pos, SEEK_SET);

box_size=read_uint32_lit(f);

fread(p,4,1, f);

p[4]=0;

std::stringname=(char*)p;if(name=="stsd") {

box.stsd=mp4_read_stsd_box(f, box_size);//根据不同的编码方案和存储数据的文件数目,//每个media可以有一个到多个sample description。//sample-to-chunk atom通过这个索引表,//找到合适medai中每个sample的description。}elseif(name=="stts"){

box.stts=mp4_read_stts_box(f, box_size);//Time-to-sample atoms存储了media sample的duration 信息,//提供了时间对具体data sample的映射方法,通过这个atom,//你可以找到任何时间的sample,类型是'stts'。}elseif(name=="stss"){

box.stss=mp4_read_stss_box(f, box_size);//sync sample atom确定media中的关键帧。}elseif(name=="stsc"){

box.stsc=mp4_read_stsc_box(f, box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7922.html//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7923.html}elseif(name=="stsz"||name=="stz2"){

box.stsz=mp4_read_stsz_box(f, box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7924.html}elseif(name=="stco"||name=="c064"){

box.stco=mp4_read_stco_box(f, box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7925.html}elseif(name=="ctts") {//@a undefined}else{//printf("\t\t====size: %u\n", box_size);printf("\t\t\t\t\t+%s===============mark undifined\n", p);

}

cur_pos+=box_size;

inner_size+=box_size;

}while(inner_size+8!=size);//printf("\n");returnbox;

}/*container box

()*/structmp4_dinf_box mp4_read_dinf_box(FILE*f,intsize)

{

printf("\t\t\t\t+dinf\n");structmp4_dinf_box box;returnbox;

}/*container box

(vmhd, smhd, hmhd, nmhd)*/structmp4_minf_box mp4_read_minf_box(FILE*f,intsize)

{structmp4_minf_box box;

printf("\t\t\t+%s\n","minf");

VARIABLES;intlevel_5_box_size=0;intcur_pos=ftell(f) ;do{

fseek(f, cur_pos, SEEK_SET);

level_5_box_size=read_uint32_lit(f);

fread(p,4,1, f);

p[4]=0;

std::stringname=(char*)p;if(name=="vmhd") {

box.vmhd=mp4_read_vmhd_box(f, level_5_box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7913.html}elseif(name=="dinf") {

box.dinf=mp4_read_dinf_box(f, level_5_box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7915.html}elseif(name=="stbl") {

box.stbl=mp4_read_stbl_box(f, level_5_box_size);//@a unfind}elseif(name=="smhd"){

box.smhd=mp4_read_smhd_box(f, level_5_box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7914.html}else{

printf("\t\t====size: %u\n", level_5_box_size);

printf("\t\t====type: %s\n", p);

}

cur_pos+=level_5_box_size;

inner_size+=level_5_box_size;

}while(inner_size+8!=size);

printf("\n");returnbox;

}/*container box

(mdhd, hdlr, minf)*/structmp4_mdia_box mp4_read_mdia_box(FILE*f,intsize)

{

printf("\t\t+%s\n","mdia");

mp4_mdia_box box;

box.size=size;

box.type='m'|'d'<<8|'i'<<16|'a'<<24;

VARIABLES;intbox_size=0;intcur_pos=ftell(f) ;do{

fseek(f, cur_pos, SEEK_SET);

box_size=read_uint32_lit(f);

fread(p,4,1, f);

p[4]=0;

std::stringname=(char*)p;if(name=="mdhd") {

box.mdhd=mp4_read_mdhd_box(f, box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7908.html}elseif(name=="hdlr") {

box.hdlr=mp4_read_hdlr_box(f, box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7909.html}elseif(name=="minf"){

box.minf=mp4_read_minf_box(f, box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7910.html}else{//printf("\t\t====size: %u\n", box_size);printf("\t\t====type: %s\n", p);

}

cur_pos+=box_size;

inner_size+=box_size;

}while(inner_size+8!=size);

printf("\n");returnbox;

}/*container box*/structmp4_udta_box mp4_read_udta_box(FILE*f,intsize)

{

printf("\t\t+%s\n","udta");returnmp4_udta_box();

}/*container box

(tkhd, mdia)*/intmp4_read_trak_box(FILE*f,intsize)

{

printf("\t+%s\n","trak");structmp4_trak_box*trak=newstructmp4_trak_box;

VARIABLES;intbox_size=0;intcur_pos=ftell(f) ;do{

fseek(f, cur_pos, SEEK_SET);

box_size=read_uint32_lit(f);

fread(p,4,1, f);

p[4]=0;

std::stringname=(char*)p;if(name=="tkhd") {

trak->tkhd=mp4_read_tkhd_box(f, box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7903.html}elseif(name=="edts") {

trak->edts=mp4_read_edts_box(f, box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7904.html}elseif(name=="mdia"){

trak->mdia=mp4_read_mdia_box(f, box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7907.html}elseif(name=="udta"){

trak->udta=mp4_read_udta_box(f, box_size);//same as the level 3 box, @a special}else{//printf("\t====size: %u\n", box_size);printf("\t\t+%s===========\n", p);

}

cur_pos+=box_size;

inner_size+=box_size;

}while(inner_size+8!=size);

moov.trak.push_back(trak);

}/*final box*/intmp4_read_iods_box(FILE*f,intsize)//level 3{

printf("\t+iods-------------------------undefined\n\n");

}/*container box

(mvhd, trak)*/intmp4_read_moov_box(FILE*f,intsize)//level 2{

printf("+%s\n","moov");

moov.size=size;

moov.type='m'|'o'<<8|'o'<<16|'v'<<24;

VARIABLES;intlevel_2_box_size=0;intcur_pos=ftell(f);do{

fseek(f, cur_pos, SEEK_SET);

level_2_box_size=read_uint32_lit(f);

fread(&k,sizeof(k),1, f);//read byteindian_a.size=k;

memcpy(p, indian_a.byte,sizeof(indian_a.byte));

p[4]=0;

std::stringname=(char*)p;if(name=="mvhd"){

mp4_read_mvhd_box(f, level_2_box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7901.html}elseif(name=="trak") {

mp4_read_trak_box(f, level_2_box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7902.html}elseif(name=="iods"){

mp4_read_iods_box(f, level_2_box_size);

}elseif(name=="udta"){

mp4_read_udta_box(f, level_2_box_size);//@a mark parse it, unknow what it is}else{

printf("====%s\n\n", p);

}

cur_pos+=level_2_box_size;

inner_size+=level_2_box_size;

}while( inner_size+8!=size);

}/*final box*/intmp4_read_ftyp_box(FILE*f,intsize)//level 2{

printf("+ftyp\n");

size-=8;char*ch=newchar[size+1];for(inti=0; i

fread(&ch[i],sizeof(char),1, f);

}

ch[size]=0;

printf("\tftyp: %s\n",  ch);

delete [] ch;

}/*@a special final box*/intmp4_read_mdat_box(FILE*f,intsize)

{

printf("\t+%s\n","mdat");

printf("\t\tthis is the real media data\n");

}/*container box

(ftyp, free, mdat, moov)*/intmp4_read_root_box(FILE*f)//level 1{intk=0;

unsignedcharp[5];intlevel_1_box_size=read_uint32_lit(f);

fread(&k,sizeof(k),1, f);//read byteindian_a.size=k;

memcpy(p, indian_a.byte,sizeof(indian_a.byte));

p[4]=0;

std::stringname=(char*)p;if(name=="moov"){

mp4_read_moov_box(f, level_1_box_size);//@ahttp://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_7900.html}elseif(name=="ftyp"){

mp4_read_ftyp_box(f, level_1_box_size);

}elseif(level_1_box_size==0){//till the end of filereturn1;

}elseif(name=="mdat"){

mp4_read_mdat_box(f, level_1_box_size);

}elseif(name=="free"){

printf("+free\n");

}else{//printf("==%u\n", level_1_box_size);printf("%s==mark undifined\n", p);

}returnlevel_1_box_size;

}voidprint_trak(conststructmp4_trak_box*trak)

{

printf("trak\n");

printf("\t+%s\n","tkhd");

printf("\t\ttrack id: %u\n", trak->tkhd.track_ID);

printf("\t\tduration: %d\n", trak->tkhd.duration);

printf("\t\t\tlayer: %d\n",trak->tkhd.layer);

printf("\t\t\talternate group: %d\n", trak->tkhd.alternate_group);

printf("\t\t\tvolume: 0x%x\n", trak->tkhd.volume);

printf("\t\t\tmatrix:\n");for(inti=0; i<3;++i){

printf("\t\t\t");for(intj=0; j<3;++j){

printf("%8u", trak->tkhd.matrix[i*3+j]);

}

printf("\n");

}

printf("\t\t\twidth: %u\n",trak->tkhd.width);

printf("\t\t\theight: [%u].[%u]\n",

trak->tkhd.height&0xffff0000>>16,

trak->tkhd.height&0xffff);

printf("\t+%s\n","mdia");

printf("\t\t\t\t\t\t+stsd\n");

printf("\t\t\t\t\t\t\tnumber of entries: %u\n",

trak->mdia.minf.stbl.stsd.number_of_entries);//printf("\t\t\t\t\t\t+stts: time to sample\n");//printf("\t\t\t\t\t\t\tentries:\n\t\t\t\t\t\t\t");//for(int i =0; i mdia.minf.stbl.stts.number_of_entries; ++i){//printf("%15u ", trak->mdia.minf.stbl.stts.time_to_sample_table[i]);//}//printf("\n");//printf("\t\t\t\t\t+stss:关键帧\n");//printf("\t\t\t\t\t\t\tentries:\n\t\t\t\t\t\t\t");//for(int i =0; i mdia.minf.stbl.stss.number_of_entries; ++i){//printf("%15u ", trak->mdia.minf.stbl.stss.sync_sample_table[i]);//}//printf("\n");printf("\t\t\t\t\t\t+stsc:sample to chunk table\n");

printf("\t\t\t\t\t\tfirst trunk:\tsamples-per-thunk:\tsample-description-ID\n");for(inti=0; imdia.minf.stbl.stsc.map_amount;++i){

printf("\t\t\t\t\t\t%13d", trak->mdia.minf.stbl.stsc.scmap[i].first_chunk_num);

printf("\t%13d", trak->mdia.minf.stbl.stsc.scmap[i].sample_amount_in_cur_table);

printf("\t%13d\n", trak->mdia.minf.stbl.stsc.scmap[i].sample_description_id);

}   printf("\n");

printf("\t\t\t\t\t\t+%s\n","stsz");

printf("\t\t\t\t\t\t\tsmple_size_table:\n\t\t\t\t\t\t");for(inti=0; imdia.minf.stbl.stsz.table_size;++i){

printf("%8u", trak->mdia.minf.stbl.stsz.sample_size_table[i]);

}   printf("\n");

printf("\t\t\t\t\t\t+stco\n");

printf("\t\t\t\t\t\tchunk offset:\n\t\t\t\t\t");for(inti=0; imdia.minf.stbl.stco.chunk_offset_amount;++i){

printf("%8u",trak->mdia.minf.stbl.stco.chunk_offset_from_file_begin[i]);

}

}

uint32_t get_sample_num_in_cur_chunk(conststructmp4_stsc_box&box,constuint32_t chunk_index)//begin from 0{intsample_num_in_cur_chunk_=0;for(inti=0; i

}if(chunk_index+1>=box.scmap[i].first_chunk_num&&chunk_index+1

sample_num_in_cur_chunk_=box.scmap[i].sample_amount_in_cur_table;break;

}

}//std::cout<

}/*@a return index from 0*/uint32_t get_sample_index(conststructmp4_stsc_box&box,constuint32_t chunk_index)//[1,end){/*chunk   samples   id

1         8        1

2         7        1

46        6        1*/uint32_t me=chunk_index;

uint32_t sindex=0;for(inti=0; i

uint32_t chunk_amount=0;

uint32_t curr=box.scmap[i].first_chunk_num;if(i+1==box.map_amount){//end() , we can't have next one to indexchunk_amount=me-curr;//do not add ONEsindex+=box.scmap[i].sample_amount_in_cur_table*chunk_amount;break;

}

uint32_t next=box.scmap[i+1].first_chunk_num;if(me>curr){if(me

chunk_amount=me-curr;//do not add ONEsindex+=box.scmap[i].sample_amount_in_cur_table*chunk_amount;break;

}else{

chunk_amount=next-curr;//do not add ONEsindex+=box.scmap[i].sample_amount_in_cur_table*chunk_amount;

}

}elseif(me==curr){break;

}

}returnsindex;

}

uint32_t get_sample_size(conststructmp4_stsz_box&box,constuint32_t chunk_index)//[0, end){for(inti=0; i

}

}voidcopy_chunk_data(FILE*fin,conststructmp4_stbl_box&box,constuint32_t chunk_index,//[0, end)FILE*fout)

{

fseek(fin, box.stco.chunk_offset_from_file_begin[chunk_index],

SEEK_SET);

uint32_t sample_num_in_cur_chunk_=get_sample_num_in_cur_chunk(box.stsc, chunk_index);//@a markuint32_t sample_index_=get_sample_index(box.stsc, chunk_index+1);

printf("%x\tindex=%u\t",

box.stco.chunk_offset_from_file_begin[chunk_index],

sample_index_);for(inti=0; i

uint32_t sample_size_=get_sample_size(box.stsz, sample_index_+i);

std::cout<

uint32_t NALU_size=0;

uint32_t NALU_total=0;while(NALU_total

NALU_size=read_uint32_lit(fin);

NALU_total+=NALU_size+4;

printf("\tNALU_size:%x\n", NALU_size);char*ptr=newchar[NALU_size];

fread(ptr, NALU_size,1, fin);staticuint32_t one=1<<24;

fwrite(&one,sizeof(one),1, fout);

fwrite(ptr, NALU_size,1, fout);

delete [] ptr;

NALU_size=0;

}

}

}voidmake_file(FILE*fin,conststructmp4_trak_box*trak, std::stringname)

{intchunk_offset_amount=trak->mdia.minf.stbl.stco.chunk_offset_amount;#ifRELEASEstructmp4_avc1_box*avc1=trak->mdia.minf.stbl.stsd.sample_description[0].avc1;

name+="x";

FILE*fout=fopen(name.c_str(),"w");if(!fout){

std::stringtmp="fopen_"+name ;

perror(tmp.c_str());

}if(avc1!=0){

uint32_t one=1<<24;

fwrite(&one,sizeof(one),1, fout);structmp4_avcC_box*avcC=avc1->avcC;

fwrite(avcC->sps[0].sequenceParameterSetNALUnit,

avcC->sps[0].sequenceParameterSetLength,1, fout);

fwrite(&one,sizeof(one),1, fout);

fwrite(avcC->pps[0].pictureParameterSetNALUnit,

avcC->pps[0].pictureParameterSetLength,1, fout);

}for(intchunk_index=0; chunk_index

copy_chunk_data(fin, trak->mdia.minf.stbl, chunk_index, fout);

}

fclose(fout);#elsesystem(std::string("rm -rf"+name).c_str());

system(std::string("mkdir"+name).c_str());for(intchunk_index=0; chunk_index

sprintf(char_num,"%u", chunk_index);

FILE*fout=fopen(std::string(name+"/"+name+char_num).c_str(),"w");if(fout==(FILE*)0){

printf("error\n");

std::exit(-1);

}

copy_chunk_data(fin, trak->mdia.minf.stbl, chunk_index, fout);

fclose(fout);

}#endif}intmain(){

std::ios_base::sync_with_stdio(true);

std::stringluo="luohunshidai01_001.mp4";

std::string_600="6004501011.mp4";//FILE *fin       = fopen(luo.c_str(), "r");FILE*fin=fopen(_600.c_str(),"r");//FILE *f_video   = fopen("video", "w+");//FILE *f_audio   = fopen("audio", "w+");if(fin==(FILE*)0){

printf("failed to open\n");return0;

}//level 0intcur_pos=ftell(fin);for(;!feof(fin); ) {

fseek(fin, cur_pos, SEEK_SET);

printf("----------------------------------------level 0\n");

cur_pos+=mp4_read_root_box(fin);

}//print_trak(moov.trak[0]);//print_trak(moov.trak[1]);make_file(fin, moov.trak[0], ("video"));//make_file(fin, moov.trak[1], ("audio"));return0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值