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

📄 mpeg2videoes.c

📁 Sun公司Dream项目
💻 C
📖 第 1 页 / 共 2 页
字号:
   
	
   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 + -