소스 검색

coreaudio-encoder: Fix pts/dts not including encoder delay

derrod 1 년 전
부모
커밋
c815d6ad61
2개의 변경된 파일15개의 추가작업 그리고 2개의 파일을 삭제
  1. 9 2
      plugins/coreaudio-encoder/encoder.cpp
  2. 6 0
      plugins/coreaudio-encoder/windows-imports.h

+ 9 - 2
plugins/coreaudio-encoder/encoder.cpp

@@ -112,6 +112,7 @@ struct ca_encoder {
 
 	uint64_t total_samples = 0;
 	uint64_t samples_per_second = 0;
+	uint32_t priming_samples = 0;
 
 	vector<uint8_t> extra_data;
 
@@ -595,6 +596,11 @@ static void *aac_create(obs_data_t *settings, obs_encoder_t *encoder)
 		ca->converter, kAudioConverterCurrentOutputStreamDescription,
 		&size, &out));
 
+	AudioConverterPrimeInfo primeInfo;
+	size = sizeof(primeInfo);
+	STATUS_CHECK(AudioConverterGetProperty(
+		ca->converter, kAudioConverterPrimeInfo, &size, &primeInfo));
+
 	/*
 	 * Fix channel map differences between CoreAudio AAC, FFmpeg, Wav
 	 * New channel mappings below assume 2.1, 4.0, 4.1, 5.1, 7.1 resp.
@@ -649,6 +655,7 @@ static void *aac_create(obs_data_t *settings, obs_encoder_t *encoder)
 	ca->in_bytes_required = ca->in_packets * ca->in_frame_size;
 
 	ca->out_frames_per_packet = out.mFramesPerPacket;
+	ca->priming_samples = primeInfo.leadingFrames;
 
 	ca->output_buffer_size = out.mBytesPerPacket;
 
@@ -770,8 +777,8 @@ static bool aac_encode(void *data, struct encoder_frame *frame,
 	if (!(*received_packet = packets > 0))
 		return true;
 
-	packet->pts = ca->total_samples;
-	packet->dts = ca->total_samples;
+	packet->pts = ca->total_samples - ca->priming_samples;
+	packet->dts = ca->total_samples - ca->priming_samples;
 	packet->timebase_num = 1;
 	packet->timebase_den = (uint32_t)ca->samples_per_second;
 	packet->type = OBS_ENCODER_AUDIO;

+ 6 - 0
plugins/coreaudio-encoder/windows-imports.h

@@ -79,6 +79,12 @@ struct AudioChannelLayout {
 };
 typedef struct AudioChannelLayout AudioChannelLayout;
 
+struct AudioConverterPrimeInfo {
+	UInt32 leadingFrames;
+	UInt32 trailingFrames;
+};
+typedef struct AudioConverterPrimeInfo AudioConverterPrimeInfo;
+
 typedef OSStatus (*AudioConverterComplexInputDataProc)(
 	AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets,
 	AudioBufferList *ioData,