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

📄 lav_io.c

📁 Motion JPEG编解码器源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
               res = scan_jpeg(jpgdata, size, n);               if (res) { internal_error=ERROR_JPEG; return -1; }               if(!jpeg_app0_offset) continue;               /* APP0 marker should be at least 14+2 bytes */               if(get_int2(jpgdata+jpeg_app0_offset+2) < 16 ) continue;               jpgdata[jpeg_app0_offset+4] = 'A';               jpgdata[jpeg_app0_offset+5] = 'V';               jpgdata[jpeg_app0_offset+6] = 'I';               jpgdata[jpeg_app0_offset+7] = '1';               jpgdata[jpeg_app0_offset+8] = lav_file->format=='a' ? n+1 : 2-n;               /* Update pointer and len for second field */               jpgdata += jpeg_padded_len;               jpglen  -= jpeg_padded_len;            }            break;         case 'j':            jpgdata = buff;            jpglen = size;            break;#ifdef HAVE_LIBQUICKTIME         case 'q':            jpgdata = buff;            jpglen  = size;            /* Loop over both fields */            for(n=0;n<2;n++)            {               /* Scan the entire JPEG field data - APP1 marker MUST be present */               res = scan_jpeg(jpgdata,jpglen,0);               if(res || !jpeg_app1_offset) { internal_error=ERROR_JPEG; return -1; }               /* Length of APP1 marker must be at least 40 + 2 bytes */               if ( get_int2(jpgdata+jpeg_app1_offset+2) < 42)               { internal_error=ERROR_JPEG; return -1; }               /* Fill in data */               put_int4(jpgdata+jpeg_app1_offset+ 4,0);               put_int4(jpgdata+jpeg_app1_offset+ 8,QUICKTIME_MJPG_TAG);               put_int4(jpgdata+jpeg_app1_offset+12,jpeg_field_size);               put_int4(jpgdata+jpeg_app1_offset+16,jpeg_padded_len);               put_int4(jpgdata+jpeg_app1_offset+20,n==0?jpeg_padded_len:0);               put_int4(jpgdata+jpeg_app1_offset+24,jpeg_quant_offset);               put_int4(jpgdata+jpeg_app1_offset+28,jpeg_huffman_offset);               put_int4(jpgdata+jpeg_app1_offset+32,jpeg_image_offset);               put_int4(jpgdata+jpeg_app1_offset+36,jpeg_scan_offset);               put_int4(jpgdata+jpeg_app1_offset+40,jpeg_data_offset);               /* Update pointer and len for second field */               jpgdata += jpeg_padded_len;               jpglen  -= jpeg_padded_len;            }            break;#endif      }   }      res = 0; /* Silence gcc */   for(n=0;n<count;n++)   {      switch(lav_file->format)      {         case 'a':         case 'A':            if(n==0)               res = AVI_write_frame( lav_file->avi_fd, buff, size );            else               res = AVI_dup_frame( lav_file->avi_fd );            break;         case 'j':            if (n==0)               write(lav_file->jpeg_fd, buff, size);            break;#ifdef HAVE_LIBQUICKTIME         case 'q':            res = quicktime_write_frame( lav_file->qt_fd, buff, size, 0 );            break;#endif         default:            res = -1;      }      if (res) break;   }   return res;}int lav_write_audio(lav_file_t *lav_file, uint8_t *buff, long samps){   int res;#ifdef HAVE_LIBQUICKTIME   int i, j;   int16_t *qt_audio = (int16_t *)buff, **qt_audion;   int channels = lav_audio_channels(lav_file);   qt_audion = malloc(channels * sizeof (int16_t **));   for (i = 0; i < channels; i++)	qt_audion[i] = (int16_t *)malloc(samps * lav_file->bps);#endif   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         res = AVI_write_audio( lav_file->avi_fd, buff, samps*lav_file->bps);         break;#ifdef HAVE_LIBQUICKTIME      case 'q':	/* Deinterleave the audio into the two channels. */	for (i = 0; i < samps; i++)	    {	    for (j = 0; j < channels; j++)		qt_audion[j][i] = qt_audio[(2*i) + j];	    }	res = lqt_encode_audio_track(lav_file->qt_fd, qt_audion, NULL,samps,0);	free(qt_audion[0]);	free(qt_audion[1]);	free(qt_audion);        break;#endif      default:         res = -1;   }   return res;}long lav_video_frames(lav_file_t *lav_file){   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_video_frames(lav_file->avi_fd);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_video_length(lav_file->qt_fd,0);#endif   }   return -1;}int lav_video_width(lav_file_t *lav_file){   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_video_width(lav_file->avi_fd);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_video_width(lav_file->qt_fd,0);#endif   }   return -1;}int lav_video_height(lav_file_t *lav_file){   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_video_height(lav_file->avi_fd);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_video_height(lav_file->qt_fd,0);#endif   }   return -1;}double lav_frame_rate(lav_file_t *lav_file){   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_frame_rate(lav_file->avi_fd);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_frame_rate(lav_file->qt_fd,0);#endif   }   return -1;}int lav_video_interlacing(lav_file_t *lav_file){   return lav_file->interlacing;}void lav_video_sampleaspect(lav_file_t *lav_file, int *sar_w, int *sar_h){  *sar_w = lav_file->sar_w;  *sar_h = lav_file->sar_h;  return;}int lav_video_MJPG_chroma(lav_file_t *lav_file){	return lav_file->MJPG_chroma;}const char *lav_video_compressor(lav_file_t *lav_file){   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_video_compressor(lav_file->avi_fd);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_video_compressor(lav_file->qt_fd,0);#endif   }   return "N/A";}int lav_audio_channels(lav_file_t *lav_file){   if(!lav_file->has_audio) return 0;   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_audio_channels(lav_file->avi_fd);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_track_channels(lav_file->qt_fd,0);#endif   }   return -1;}int lav_audio_bits(lav_file_t *lav_file){   if(!lav_file->has_audio) return 0;   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_audio_bits(lav_file->avi_fd);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_audio_bits(lav_file->qt_fd,0);#endif   }   return -1;}long lav_audio_rate(lav_file_t *lav_file){   if(!lav_file->has_audio) return 0;   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_audio_rate(lav_file->avi_fd);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_sample_rate(lav_file->qt_fd,0);#endif   }   return -1;}long lav_audio_samples(lav_file_t *lav_file){   if(!lav_file->has_audio) return 0;   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_audio_bytes(lav_file->avi_fd)/lav_file->bps;#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_audio_length(lav_file->qt_fd,0);#endif   }   return -1;}long lav_frame_size(lav_file_t *lav_file, long frame){   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_frame_size(lav_file->avi_fd,frame);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_frame_size(lav_file->qt_fd,frame,0);#endif   }   return -1;}int lav_seek_start(lav_file_t *lav_file){   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_seek_start(lav_file->avi_fd);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_seek_start(lav_file->qt_fd);#endif   }   return -1;}int lav_set_video_position(lav_file_t *lav_file, long frame){   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_set_video_position(lav_file->avi_fd,frame);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_set_video_position(lav_file->qt_fd,frame,0);#endif   }   return -1;}int lav_read_frame(lav_file_t *lav_file, uint8_t *vidbuf){   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_read_frame(lav_file->avi_fd,vidbuf);#ifdef HAVE_LIBQUICKTIME      case 'q':         return quicktime_read_frame(lav_file->qt_fd,vidbuf,0);#endif   }   return -1;}int lav_set_audio_position(lav_file_t *lav_file, long sample){   if(!lav_file->has_audio) return 0;   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_set_audio_position(lav_file->avi_fd,sample*lav_file->bps);#ifdef HAVE_LIBQUICKTIME      case 'q':         quicktime_set_audio_position(lav_file->qt_fd,sample,0);#endif   }   return -1;}long lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps){#ifdef	HAVE_LIBQUICKTIME   int64_t last_pos, start_pos;   int res, i, j;   int16_t *qt_audio = (int16_t *)audbuf, **qt_audion;   int channels = lav_audio_channels(lav_file);   qt_audion = malloc(channels * sizeof (int16_t **));   for (i = 0; i < channels; i++)	qt_audion[i] = (int16_t *)malloc(samps * lav_file->bps);#endif   if(!lav_file->has_audio)   {      internal_error = ERROR_NOAUDIO;      return(-1);   }   video_format = lav_file->format; internal_error = 0; /* for error messages */   switch(lav_file->format)   {      case 'a':      case 'A':         return AVI_read_audio(lav_file->avi_fd,audbuf,samps*lav_file->bps)/lav_file->bps;#ifdef HAVE_LIBQUICKTIME      case 'q':	start_pos = quicktime_audio_position(lav_file->qt_fd, 0);	lqt_decode_audio_track(lav_file->qt_fd, qt_audion, NULL, samps, 0);	last_pos = lqt_last_audio_position(lav_file->qt_fd, 0);	res = last_pos - start_pos;	if (res <= 0)	   goto out;	/* Interleave the channels of audio into the one buffer provided */	for (i =0; i < res; i++)	    {	    for (j = 0; j < channels; j++)		qt_audio[(2*i) + j] = qt_audion[j][i];	    }out:	 free(qt_audion[0]);	 free(qt_audion[1]);	 free(qt_audion);         return(res);#endif   }   return -1;}lav_file_t *lav_open_input_file(char *filename){   int n;   const char *video_comp = NULL;#ifdef	HAVE_LIBQUICKTIME   char *audio_comp;#endif   unsigned char *frame = NULL; /* Make sure un-init segfaults! */   long len;   int jpg_height, jpg_width, ncomps, hf[3], vf[3];   int ierr;   lav_file_t *lav_fd = (lav_file_t*) malloc(sizeof(lav_file_t));   if(lav_fd==0) { internal_error=ERROR_MALLOC; return 0; }

⌨️ 快捷键说明

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