diff --git a/submodules/MediaPlayer/Sources/SoftwareVideoSource.swift b/submodules/MediaPlayer/Sources/SoftwareVideoSource.swift index dfb882b54b..1e3ac2a531 100644 --- a/submodules/MediaPlayer/Sources/SoftwareVideoSource.swift +++ b/submodules/MediaPlayer/Sources/SoftwareVideoSource.swift @@ -435,7 +435,7 @@ public final class SoftwareAudioSource { let (decodableFrame, _) = self.readDecodableFrame() if let decodableFrame = decodableFrame { - return (decodableFrame.copyPacketData(), Int(decodableFrame.packet.duration - max(0, -decodableFrame.packet.pts))) + return (decodableFrame.copyPacketData(), Int(decodableFrame.packet.duration)) } else { return nil } diff --git a/submodules/TelegramVoip/Sources/GroupCallContext.swift b/submodules/TelegramVoip/Sources/GroupCallContext.swift index 07e00ef9ce..964fcd7e2a 100644 --- a/submodules/TelegramVoip/Sources/GroupCallContext.swift +++ b/submodules/TelegramVoip/Sources/GroupCallContext.swift @@ -64,12 +64,24 @@ private final class DemoBroadcastPacketSource { let fileName = String(format: "%04d", index) if let path = getAppBundle().path(forResource: fileName, ofType: "ogg") { - let source = SoftwareAudioSource(path: path) + let source1 = SoftwareAudioSource(path: path) + let source2 = SoftwareAudioSource(path: path) + let frames = OggOpusReader.extractFrames(try! Data(contentsOf: URL(fileURLWithPath: path)))! while true { - if let frame = source.readFrame() { - packets.append(OngoingGroupCallBroadcastPacket(numSamples: Int32(frame.count / 2), data: frame)) + if true { + if let (frame, numSamples) = source1.readEncodedFrame() { + let decodedFrame = source2.readFrame()! + + packets.append(OngoingGroupCallBroadcastPacket(numSamples: Int32(numSamples), data: frames[packets.count].data, decodedData: decodedFrame)) + } else { + break + } } else { - break + if let frame = source2.readFrame() { + packets.append(OngoingGroupCallBroadcastPacket(numSamples: Int32(frame.count / 2), data: frame, decodedData: frame)) + } else { + break + } } } } diff --git a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h index 1b9ec8dd23..e8e7eadca4 100644 --- a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h +++ b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h @@ -169,8 +169,9 @@ typedef NS_ENUM(int32_t, GroupCallNetworkState) { @property (nonatomic, readonly) int numSamples; @property (nonatomic, strong, readonly) NSData * _Nonnull data; +@property (nonatomic, strong, readonly) NSData * _Nonnull decodedData; -- (instancetype _Nonnull)initWithNumSamples:(int)numSamples data:(NSData * _Nonnull)data; +- (instancetype _Nonnull)initWithNumSamples:(int)numSamples data:(NSData * _Nonnull)data decodedData:(NSData * _Nonnull)decodedData; @end diff --git a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm index 05d498f598..2d532a08ea 100644 --- a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm +++ b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm @@ -1407,8 +1407,13 @@ static void processJoinPayload(tgcalls::GroupJoinPayload &payload, void (^ _Nonn for (OngoingGroupCallBroadcastPacket *packet in packets) { tgcalls::BroadcastPacket parsedPacket; parsedPacket.numSamples = packet.numSamples; + parsedPacket.data.resize(packet.data.length); [packet.data getBytes:parsedPacket.data.data() length:packet.data.length]; + + parsedPacket.decodedData.resize(packet.decodedData.length); + [packet.decodedData getBytes:parsedPacket.decodedData.data() length:packet.decodedData.length]; + parsedPackets.push_back(std::move(parsedPacket)); } ((tgcalls::GroupInstanceCustomImpl *)(_instance.get()))->addBroadcastPackets(std::move(parsedPackets)); @@ -1431,11 +1436,12 @@ static void processJoinPayload(tgcalls::GroupJoinPayload &payload, void (^ _Nonn @implementation OngoingGroupCallBroadcastPacket -- (instancetype _Nonnull)initWithNumSamples:(int)numSamples data:(NSData * _Nonnull)data { +- (instancetype _Nonnull)initWithNumSamples:(int)numSamples data:(NSData * _Nonnull)data decodedData:(NSData * _Nonnull)decodedData { self = [super init]; if (self != nil) { _numSamples = numSamples; _data = data; + _decodedData = decodedData; } return self; }