Skip to content

Commit 009ff2a

Browse files
committed
Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios
2 parents faad013 + 4c0dc35 commit 009ff2a

File tree

9 files changed

+450
-362
lines changed

9 files changed

+450
-362
lines changed

submodules/FFMpegBinding/Public/FFMpegBinding/FFMpegPacket.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN
1616

1717
- (void *)impl;
1818
- (int32_t)sendToDecoder:(FFMpegAVCodecContext *)codecContext;
19+
- (void)reuse;
1920

2021
@end
2122

submodules/FFMpegBinding/Sources/FFMpegAVFormatContext.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ - (void)seekFrameForStreamIndex:(int32_t)streamIndex byteOffset:(int64_t)byteOff
7777
}
7878

7979
- (bool)readFrameIntoPacket:(FFMpegPacket *)packet {
80+
[packet reuse];
8081
int result = av_read_frame(_impl, (AVPacket *)[packet impl]);
8182
return result >= 0;
8283
}

submodules/FFMpegBinding/Sources/FFMpegPacket.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,8 @@ - (int32_t)sendToDecoder:(FFMpegAVCodecContext *)codecContext {
6565
return avcodec_send_packet((AVCodecContext *)[codecContext impl], _impl);
6666
}
6767

68+
- (void)reuse {
69+
av_packet_unref(_impl);
70+
}
71+
6872
@end

submodules/LegacyComponents/Sources/TGMediaPickerGalleryVideoScrubber.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ - (instancetype)initWithFrame:(CGRect)frame cover:(bool)cover
287287

288288
NSTimeInterval duration = trimEndPosition - trimStartPosition;
289289

290-
if (trimEndPosition - trimStartPosition < self.minimumLength)
290+
if (trimEndPosition - trimStartPosition < strongSelf.minimumLength)
291291
return;
292292

293293
if (strongSelf.maximumLength > DBL_EPSILON && duration > strongSelf.maximumLength)

submodules/MediaPlayer/Sources/ChunkMediaPlayerDirectFetchSourceImpl.swift

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -472,12 +472,16 @@ final class ChunkMediaPlayerDirectFetchSourceImpl: ChunkMediaPlayerSourceImpl {
472472
return self.partsStateValue.get()
473473
}
474474

475+
private var resourceSizeDisposable: Disposable?
475476
private var completeFetchDisposable: Disposable?
476477

477478
private var seekTimestamp: Double?
478479
private var currentLookaheadId: Int = 0
479480
private var lookahead: FFMpegLookahead?
480481

482+
private var resolvedResourceSize: Int64?
483+
private var pendingSeek: (id: Int, position: Double)?
484+
481485
init(resource: ChunkMediaPlayerV2.SourceDescription.ResourceDescription) {
482486
self.resource = resource
483487

@@ -494,16 +498,43 @@ final class ChunkMediaPlayerDirectFetchSourceImpl: ChunkMediaPlayerSourceImpl {
494498
}
495499

496500
deinit {
501+
self.resourceSizeDisposable?.dispose()
497502
self.completeFetchDisposable?.dispose()
498503
}
499504

500505
func seek(id: Int, position: Double) {
506+
if self.resource.size == 0 && self.resolvedResourceSize == nil {
507+
self.pendingSeek = (id, position)
508+
509+
if self.resourceSizeDisposable == nil {
510+
self.resourceSizeDisposable = (self.resource.postbox.mediaBox.resourceData(self.resource.reference.resource, option: .complete(waitUntilFetchStatus: false))
511+
|> deliverOnMainQueue).start(next: { [weak self] data in
512+
guard let self else {
513+
return
514+
}
515+
if data.complete {
516+
if self.resolvedResourceSize == nil {
517+
self.resolvedResourceSize = data.size
518+
519+
if let pendingSeek = self.pendingSeek {
520+
self.seek(id: pendingSeek.id, position: pendingSeek.position)
521+
}
522+
}
523+
}
524+
})
525+
}
526+
527+
return
528+
}
529+
501530
self.seekTimestamp = position
502531

503532
self.currentLookaheadId += 1
504533
let lookaheadId = self.currentLookaheadId
505534

506535
let resource = self.resource
536+
let resourceSize = self.resolvedResourceSize ?? Int64(resource.size)
537+
507538
let updateState: (FFMpegLookahead.State) -> Void = { [weak self] state in
508539
Queue.mainQueue().async {
509540
guard let self else {
@@ -559,7 +590,7 @@ final class ChunkMediaPlayerDirectFetchSourceImpl: ChunkMediaPlayerSourceImpl {
559590
return ChunkMediaPlayerPartsState.DirectReader.Stream(
560591
mediaBox: resource.postbox.mediaBox,
561592
resource: resource.reference.resource,
562-
size: resource.size,
593+
size: resourceSize,
563594
index: media.info.index,
564595
seek: (streamIndex: state.seek.streamIndex, pts: state.seek.pts),
565596
maxReadablePts: (streamIndex: maxReadablePts.streamIndex, pts: maxReadablePts.pts, isEnded: state.isEnded),
@@ -602,18 +633,18 @@ final class ChunkMediaPlayerDirectFetchSourceImpl: ChunkMediaPlayerSourceImpl {
602633
).startStrict()
603634
},
604635
getDataInRange: { range, completion in
605-
return resource.postbox.mediaBox.resourceData(resource.reference.resource, size: resource.size, in: range, mode: .complete).start(next: { result, isComplete in
636+
return resource.postbox.mediaBox.resourceData(resource.reference.resource, size: resourceSize, in: range, mode: .complete).start(next: { result, isComplete in
606637
completion(isComplete ? result : nil)
607638
})
608639
},
609640
isDataCachedInRange: { range in
610641
return resource.postbox.mediaBox.internal_resourceDataIsCached(
611642
id: resource.reference.resource.id,
612-
size: resource.size,
643+
size: resourceSize,
613644
in: range
614645
)
615646
},
616-
size: self.resource.size
647+
size: resourceSize
617648
)
618649
}
619650

0 commit comments

Comments
 (0)