📄 mpeg2videoes.c
字号:
temp_file = fopen("ascii.meta", "w");
output_stream_name= (char *)malloc(strlen(resource_name)+ 10);
sprintf(output_stream_name, "%s.1X.es", resource_name);
file= fopen(output_stream_name,"wb");
if (file == NULL)
FATAL_ERROR("Cannot open file for stream");
//initialise the metadata file
// meta_file_name= (char *)malloc(strlen(resource_name)+ 10);
// sprintf(meta_file_name, "%s.mpg_META", resource_name);
meta = init_metadata(meta_file_name,1);
meta_file = meta->meta_file;
assert(meta_file != NULL);
ppp=skipToNextStartCode(pipe);
frameNumber = -1;
while(pipeIsAvail(pipe, 1)){
pos = pipePosition(pipe);
ppp = PIPE_GET(pipe, Mpeg2VideoEsStartCode) ;
assert(IS_MPEG2_VIDEO_ES_START_CODE_PREFIX(ppp)); //expecting a startcode
startcode = ppp->packetStartCodeByte;
if (startcode == MPEG2_VIDEO_SEQUENCE_END_CODE) {
fwrite(ppp,1,sizeof(*ppp),file);
break; // this is slightly fragile as we expect the seqence eddnd always
}
if(IS_PICTURE_START_CODE(startcode)){
frameNumber++;
picHeader = PIPE_GET(pipe,Mpeg2VideoPictureHeader);
if (IS_IFRAME(picHeader))
frametype = INTRA_CODED_TYPE;
else if(IS_PFRAME(picHeader))
frametype = PREDICTIVE_CODED_TYPE;
else if(IS_BFRAME(picHeader))
frametype = BIDIRECTIONAL_CODED_TYPE;
else {
frametype = UNKNOWN;
fprintf(stderr, "found an unknown picture frame at offset%ullx\
and frame number %l",pos, frameNumber);
}
// writing the meta data
temp.frame_number = frameNumber;
temp.frametype = frametype;
temp.offset = pos;
fwrite(&temp,1,sizeof(temp),meta_file);
fprintf(temp_file,"%ld %d %llx\n", frameNumber, frametype, pos);
copy_picture_header(ppp,picHeader,file);
copyTillNextStartCode(pipe,file);
}else {
assert(fwrite(ppp,1,sizeof(*ppp),file)== sizeof(*ppp));
copyTillNextStartCode(pipe,file);
}
}
// find the average frame length
avg_frame_len = pos/(frameNumber-1);
fseek(meta_file,sizeof(metadata_header)+sizeof(int),SEEK_SET); //sizeof(int) is for stream_metadata->speed
fwrite(&avg_frame_len,1,sizeof(avg_frame_len),meta_file);
//meta_cleanup(meta);
fclose(file);
fclose(meta_file);
return Boolean(true);//FIXME
}
void copy_picture_header(Mpeg2VideoEsStartCode *ppp,Mpeg2VideoPictureHeader *header, FILE *file){
assert(file);
assert(ppp);
assert(header);
assert(fwrite(ppp,1,sizeof(Mpeg2VideoEsStartCode),file) == sizeof(Mpeg2VideoEsStartCode)); //startcode written
assert(fwrite(header,1,sizeof(header),file) == sizeof(header)); //writen the heder;
}
void copyIFrame(Pipe pipe, FILE *file){
Mpeg2VideoEsStartCode *ppp;
u8 startcode;
Boolean done;
done = Boolean(false);
//copy till the next header is not
do {
assert(ppp = copyTillNextStartCode(pipe,file));
startcode = ppp->packetStartCodeByte;
if ( startcode != MPEG2_VIDEO_EXTENSION_START_CODE &&
startcode != MPEG2_VIDEO_USER_DATA_START_CODE &&
(startcode >= MPEG2_VIDEO_SLICE_START_CODE_MIN &&
startcode <= MPEG2_VIDEO_SLICE_START_CODE_MAX)
){
ppp = PIPE_GET(pipe, Mpeg2VideoEsStartCode) ;
fwrite(ppp,1,sizeof(Mpeg2VideoEsStartCode),file);
}
else
done = Boolean(true);
}while(done == false);
return;
}
Mpeg2VideoEsStartCode* skipPictureFrame(Pipe pipe){
Mpeg2VideoEsStartCode *ppp;
u8 startcode;
Boolean done;
done = Boolean(false);
//copy till the next header is not
do {
assert(ppp = skipToNextStartCode(pipe));
startcode = ppp->packetStartCodeByte;
}while( startcode != MPEG2_VIDEO_EXTENSION_START_CODE &&
startcode != MPEG2_VIDEO_USER_DATA_START_CODE &&
(startcode >= MPEG2_VIDEO_SLICE_START_CODE_MIN &&
startcode <= MPEG2_VIDEO_SLICE_START_CODE_MAX)
);
return ppp;
}
/*
PipePosition copy_picture_header(Mpeg2VideoEsStartCode *ppp,Mpeg2VideoPictureHeader *header, FILE *file){
PipePosition pos = 0;
assert(file);
assert(ppp);
assert(header);
assert(fwrite(ppp,1,sizeof(Mpeg2VideoEsStartCode),file) == sizeof(Mpeg2VideoEsStartCode)); //startcode written
assert(fwrite(header,1,sizeof(*header),file) == sizeof(*header)); //writen the heder;
pos += sizeof(Mpeg2VideoEsStartCode) + sizeof(*header);
return pos;
}
PipePosition copyIFrame(Pipe pipe, FILE *file){
Mpeg2VideoEsStartCode *ppp;
u8 startcode;
Boolean done;
PipePosition pos =0;
done = false;
ppp = malloc(sizeof(Mpeg2VideoEsStartCode));
do {
assert(pos+=copyTillNextStartCode(pipe,&ppp,file));
startcode = ppp->packetStartCodeByte;
if ( startcode != MPEG2_VIDEO_EXTENSION_START_CODE &&
startcode != MPEG2_VIDEO_USER_DATA_START_CODE &&
(startcode >= MPEG2_VIDEO_SLICE_START_CODE_MIN &&
startcode <= MPEG2_VIDEO_SLICE_START_CODE_MAX)
){
ppp = PIPE_GET(pipe, Mpeg2VideoEsStartCode) ;
fwrite(ppp,1,sizeof(Mpeg2VideoEsStartCode),file);
pos += sizeof(Mpeg2VideoEsStartCode);
}
else
done = true;
}while(done == false);
return pos ;
}
Mpeg2VideoEsStartCode* skipPictureFrame(Pipe pipe){
Mpeg2VideoEsStartCode *ppp;
u8 startcode;
Boolean done;
done = false;
//copy till the next header is not
do {
assert(ppp = skipToNextStartCode(pipe));
startcode = ppp->packetStartCodeByte;
}while( startcode != MPEG2_VIDEO_EXTENSION_START_CODE &&
startcode != MPEG2_VIDEO_USER_DATA_START_CODE &&
(startcode >= MPEG2_VIDEO_SLICE_START_CODE_MIN &&
startcode <= MPEG2_VIDEO_SLICE_START_CODE_MAX)
);
return ppp;
}
*/
//static RetCode
//mpeg2VideoEsParse(void *instp, MmpContextObject *cop, Pipe pipe){
//
// Mpeg2VideoEs mpeg2VideoEs = (Mpeg2VideoEs)instp ;
// Mpeg2VideoEsInfo info ;
// Mpeg2VideoEsInfo *infop = &info ;
// Mpeg2VideoEsStartCode *ppp ;
// int seqHdrflag = 0, len, getlen;
// u8 *buf ;
// RetCode retcode = RETCODE_SUCCESS ;
// unsigned pid ;
// Boolean exitwhile = FALSE;
// unsigned startcode ;
// PipePosition pos, pos2;
// u32 curlen = 0;
// u8 *tmp;
// tmp = malloc(sizeof(int)*40);
//
// mpeg2VideoEs->isDirty = TRUE ;
//
// pid = MMP_CONTEXT_PIPETOPID(cop, pipe);
//
// /* if(pid != MMP_PID_NULL){
// pipeFindMark(pipe) ;
// }
// */
// file12 = fopen ("output.es","w");
//
// findStartCodeprefix(pipe);
//
// //UT_LOG_MESG(&logp, (&logp, " mpeg2VideoEsParse : video Parser called \n"));
//
// mpeg2VideoEs->curptr = mpeg2VideoEs->bufDataptr;
//
// *(&(mpeg2VideoEs->noVideo)) = FALSE;
//
// while(pipeIsAvail(pipe, 1)){
// if(pipeIsAtMark(pipe)){
// buf = pipeGet(pipe, 1) ;
// len = 1;
// memcpy(mpeg2VideoEs->curptr, buf, len);
// (*(mpeg2VideoEs->bufDatasize))++;
// mpeg2VideoEs->curptr++;
// printf("Position in the stream is %x", pos);
// /*mpeg2VideoEs->bufDataptr++;*/
//
// /*if(len != write(mpeg2VideoEs->filep, buf, len)){
// UT_LOG_MESG(&logp, (&logp, "mpeg2VideoEsparse : Write failed \n")) ;
// return RETCODE_FAILED ;
// }*/
// }else{
// len = pipeAvailUnmarked(pipe) ;
// /* Get only chunks of data, so only a small buffer needs to be allocated */
// while(len > 0){
// if(len > MPEG2_VIDEOES_MAX_CHUNK){
// getlen = MPEG2_VIDEOES_MAX_CHUNK ;
// len -= MPEG2_VIDEOES_MAX_CHUNK ;
// }else{
// getlen = len ;
// len = 0;
// }
// pos = pipePosition(pipe);
// buf = pipeGet(pipe, getlen) ;
//
// if((*(mpeg2VideoEs->bufDatasize))+getlen <
// (*(mpeg2VideoEs->bufLimit)) ){
// memcpy(mpeg2VideoEs->curptr, buf, getlen);
// (*(mpeg2VideoEs->bufDatasize)) += getlen;
// mpeg2VideoEs->curptr += getlen;
// /*mpeg2VideoEs->bufDataptr += getlen;*/
// }
// else{
// /* the output buf is full, copy some data into buf */
// curlen = (*(mpeg2VideoEs->bufLimit)) - (*(mpeg2VideoEs->bufDatasize));
// memcpy(mpeg2VideoEs->curptr, buf, curlen);
// (*(mpeg2VideoEs->bufDatasize)) += curlen;
// mpeg2VideoEs->curptr += curlen;
// fwrite(mpeg2VideoEs->bufBase,1,*(mpeg2VideoEs->bufDatasize),file12 );
// /*mpeg2VideoEs->bufDataptr += curlen;*/
//
// /* wait for video decoder to read filledBuf*/
// fprintf( stderr, "video_es: in While: posting sema \n");
// //sema_post(&(mpeg2VideoEs->semaBufFilled));
// //sema_wait(&(mpeg2VideoEs->semaBufReleased));
//
// /* copy the remaining data into buf */
// mpeg2VideoEs->curptr = mpeg2VideoEs->bufDataptr; //remove this just for testing
// *(mpeg2VideoEs->bufDatasize) = 0;
// memcpy(mpeg2VideoEs->curptr, buf+curlen, getlen-curlen);
// (*(mpeg2VideoEs->bufDatasize)) += getlen-curlen;
// mpeg2VideoEs->curptr += getlen-curlen;
//
// /*mpeg2VideoEs->bufDataptr += getlen-curlen;*/
// }
// }
// }
// }
//fwrite(mpeg2VideoEs->bufBase,1,*(mpeg2VideoEs->bufDatasize),file12 );
//fclose(file12);
////fprintf( stderr, " video_es : posting sema outside while \n");
// // sema_post(&(mpeg2VideoEs->semaBufFilled));
//
// /* if(mpeg2VideoEs->parseDone){
// sema_post(&(mpeg2VideoEs->semaBufFilled));
// sema_wait(&(mpeg2VideoEs->semaBufReleased));
// }*/
//
// /*sema_wait(&(mpeg2VideoEs->semaBufReleased));*/
//
// return RETCODE_SUCCESS ;
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -