📄 lav_io.c
字号:
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 + -