|  |  | @@ -464,9 +464,15 @@ static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) | 
		
	
		
			
			|  |  |  | uint32_t tag = track->tag; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (track->mode == MODE_MOV) { | 
		
	
		
			
			|  |  |  | if (mov_get_lpcm_flags(track->enc->codec_id)) | 
		
	
		
			
			|  |  |  | tag = AV_RL32("lpcm"); | 
		
	
		
			
			|  |  |  | version = 2; | 
		
	
		
			
			|  |  |  | if (track->timescale > UINT16_MAX) { | 
		
	
		
			
			|  |  |  | if (mov_get_lpcm_flags(track->enc->codec_id)) | 
		
	
		
			
			|  |  |  | tag = AV_RL32("lpcm"); | 
		
	
		
			
			|  |  |  | version = 2; | 
		
	
		
			
			|  |  |  | } else if (track->audio_vbr || mov_pcm_le_gt16(track->enc->codec_id) || | 
		
	
		
			
			|  |  |  | track->enc->codec_id == CODEC_ID_ADPCM_MS || | 
		
	
		
			
			|  |  |  | track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) { | 
		
	
		
			
			|  |  |  | version = 1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | avio_wb32(pb, 0); /* size */ | 
		
	
	
		
			
				|  |  | @@ -493,18 +499,34 @@ static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) | 
		
	
		
			
			|  |  |  | avio_wb32(pb, av_get_bits_per_sample(track->enc->codec_id)); | 
		
	
		
			
			|  |  |  | avio_wb32(pb, mov_get_lpcm_flags(track->enc->codec_id)); | 
		
	
		
			
			|  |  |  | avio_wb32(pb, track->sampleSize); | 
		
	
		
			
			|  |  |  | avio_wb32(pb, track->audio_vbr ? track->enc->frame_size : 1); | 
		
	
		
			
			|  |  |  | avio_wb32(pb, track->enc->frame_size); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | /* reserved for mp4/3gp */ | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 2); | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 16); | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 0); | 
		
	
		
			
			|  |  |  | if (track->mode == MODE_MOV) { | 
		
	
		
			
			|  |  |  | avio_wb16(pb, track->enc->channels); | 
		
	
		
			
			|  |  |  | if (track->enc->codec_id == CODEC_ID_PCM_U8 || | 
		
	
		
			
			|  |  |  | track->enc->codec_id == CODEC_ID_PCM_S8) | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 8); /* bits per sample */ | 
		
	
		
			
			|  |  |  | else | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 16); | 
		
	
		
			
			|  |  |  | avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */ | 
		
	
		
			
			|  |  |  | } else { /* reserved for mp4/3gp */ | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 2); | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 16); | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 0); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 0); /* packet size (= 0) */ | 
		
	
		
			
			|  |  |  | avio_wb16(pb, track->timescale); /* Time scale */ | 
		
	
		
			
			|  |  |  | avio_wb16(pb, 0); /* Reserved */ | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(version == 1) { /* SoundDescription V1 extended info */ | 
		
	
		
			
			|  |  |  | avio_wb32(pb, track->enc->frame_size); /* Samples per packet */ | 
		
	
		
			
			|  |  |  | avio_wb32(pb, track->sampleSize / track->enc->channels); /* Bytes per packet */ | 
		
	
		
			
			|  |  |  | avio_wb32(pb, track->sampleSize); /* Bytes per frame */ | 
		
	
		
			
			|  |  |  | avio_wb32(pb, 2); /* Bytes per sample */ | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(track->mode == MODE_MOV && | 
		
	
		
			
			|  |  |  | (track->enc->codec_id == CODEC_ID_AAC || | 
		
	
		
			
			|  |  |  | track->enc->codec_id == CODEC_ID_AC3 || | 
		
	
	
		
			
				|  |  | @@ -2279,6 +2301,9 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) | 
		
	
		
			
			|  |  |  | av_log(s, AV_LOG_ERROR, "fatal error, input is not a single packet, implement a AVParser for it\n"); | 
		
	
		
			
			|  |  |  | return -1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } else if (enc->codec_id == CODEC_ID_ADPCM_MS || | 
		
	
		
			
			|  |  |  | enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) { | 
		
	
		
			
			|  |  |  | samplesInChunk = enc->frame_size; | 
		
	
		
			
			|  |  |  | } else if (trk->sampleSize) | 
		
	
		
			
			|  |  |  | samplesInChunk = size/trk->sampleSize; | 
		
	
		
			
			|  |  |  | else | 
		
	
	
		
			
				|  |  | @@ -2520,21 +2545,21 @@ static int mov_write_header(AVFormatContext *s) | 
		
	
		
			
			|  |  |  | "or choose different container.\n"); | 
		
	
		
			
			|  |  |  | }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO){ | 
		
	
		
			
			|  |  |  | track->timescale = st->codec->sample_rate; | 
		
	
		
			
			|  |  |  | /* set sampleSize for PCM and ADPCM */ | 
		
	
		
			
			|  |  |  | if (av_get_bits_per_sample(st->codec->codec_id)) { | 
		
	
		
			
			|  |  |  | if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) { | 
		
	
		
			
			|  |  |  | av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i); | 
		
	
		
			
			|  |  |  | goto error; | 
		
	
		
			
			|  |  |  | }else if(st->codec->codec_id == CODEC_ID_ADPCM_MS || | 
		
	
		
			
			|  |  |  | st->codec->codec_id == CODEC_ID_ADPCM_IMA_WAV){ | 
		
	
		
			
			|  |  |  | if (!st->codec->block_align) { | 
		
	
		
			
			|  |  |  | av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set\n", i); | 
		
	
		
			
			|  |  |  | av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set for adpcm\n", i); | 
		
	
		
			
			|  |  |  | goto error; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | track->sampleSize = st->codec->block_align; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | /* set audio_vbr for compressed audio */ | 
		
	
		
			
			|  |  |  | if (av_get_bits_per_sample(st->codec->codec_id) < 8) { | 
		
	
		
			
			|  |  |  | if (!st->codec->frame_size) { | 
		
	
		
			
			|  |  |  | av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i); | 
		
	
		
			
			|  |  |  | goto error; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }else if(st->codec->frame_size > 1){ /* assume compressed audio */ | 
		
	
		
			
			|  |  |  | track->audio_vbr = 1; | 
		
	
		
			
			|  |  |  | }else{ | 
		
	
		
			
			|  |  |  | st->codec->frame_size = 1; | 
		
	
		
			
			|  |  |  | track->sampleSize = (av_get_bits_per_sample(st->codec->codec_id) >> 3) * st->codec->channels; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if (track->mode != MODE_MOV) { | 
		
	
		
			
			|  |  |  | if (track->timescale > UINT16_MAX) { | 
		
	
	
		
			
				|  |  | 
 |