mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-28 02:06:12 -04:00
win-dshow: Add LGP timestamp fix
LGP devices are devices that induce anger in any sane developer because they're prone to bad audio timestamps when using their decoded data directly. For that reason, add a hack that smooths the timestamps within a large threshold to prevent audio skipping.
This commit is contained in:
@@ -16,6 +16,8 @@
|
||||
******************************************************************************/
|
||||
|
||||
#include "ffmpeg-decode.h"
|
||||
#include <util/util_uint128.h>
|
||||
#include <util/base.h>
|
||||
#include <obs-avc.h>
|
||||
|
||||
int ffmpeg_decode_init(struct ffmpeg_decode *decode, enum AVCodecID id)
|
||||
@@ -107,8 +109,33 @@ static inline void copy_data(struct ffmpeg_decode *decode, uint8_t *data,
|
||||
memcpy(decode->packet_buffer, data, size);
|
||||
}
|
||||
|
||||
static void do_idiotic_lgp_audio_packet_realignment(
|
||||
struct ffmpeg_decode *decode, long long *ts)
|
||||
{
|
||||
uint64_t new_ts = (uint64_t)*ts;
|
||||
util_uint128_t u128;
|
||||
|
||||
if (!decode->lgp_started) {
|
||||
decode->lgp_start_ts = new_ts;
|
||||
decode->lgp_next_expected_ts = new_ts;
|
||||
decode->lgp_started = true;
|
||||
}
|
||||
|
||||
if (llabs(decode->lgp_next_expected_ts - new_ts) < 3000000ULL) {
|
||||
*ts = (long long)decode->lgp_next_expected_ts;
|
||||
} else {
|
||||
decode->lgp_start_ts = new_ts;
|
||||
decode->lgp_frames_since_start = 0;
|
||||
}
|
||||
|
||||
decode->lgp_frames_since_start += (uint64_t)decode->frame->nb_samples;
|
||||
u128 = util_mul64_64(decode->lgp_frames_since_start, 10000000ULL);
|
||||
decode->lgp_next_expected_ts = decode->lgp_start_ts +
|
||||
util_div128_32(u128, (uint32_t)decode->frame->sample_rate).low;
|
||||
}
|
||||
|
||||
int ffmpeg_decode_audio(struct ffmpeg_decode *decode,
|
||||
uint8_t *data, size_t size,
|
||||
uint8_t *data, size_t size, long long *ts,
|
||||
struct obs_source_audio *audio,
|
||||
bool *got_output)
|
||||
{
|
||||
@@ -148,6 +175,9 @@ int ffmpeg_decode_audio(struct ffmpeg_decode *decode,
|
||||
if (audio->format == AUDIO_FORMAT_UNKNOWN)
|
||||
return 0;
|
||||
|
||||
if (decode->fix_braindead_lgp_audio_packet_stupidity)
|
||||
do_idiotic_lgp_audio_packet_realignment(decode, ts);
|
||||
|
||||
*got_output = true;
|
||||
return len;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user