mirror of
https://github.com/DKJone/DKWechatHelper.git
synced 2025-05-25 12:26:10 +08:00
102 lines
2.8 KiB
Objective-C
102 lines
2.8 KiB
Objective-C
// QGAnimatedImageBufferManager.m
|
|
// Tencent is pleased to support the open source community by making vap available.
|
|
//
|
|
// Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
|
|
//
|
|
// Licensed under the MIT License (the "License"); you may not use this file except in
|
|
// compliance with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://opensource.org/licenses/MIT
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software distributed under the License is
|
|
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
// either express or implied. See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#import "QGAnimatedImageBufferManager.h"
|
|
#import "QGVAPSafeMutableArray.h"
|
|
|
|
@interface QGAnimatedImageBufferManager() {
|
|
|
|
QGAnimatedImageDecodeConfig *_config; //解码配置
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation QGAnimatedImageBufferManager
|
|
|
|
- (instancetype)initWithConfig:(QGAnimatedImageDecodeConfig *)config {
|
|
|
|
if (self = [super init]) {
|
|
_config = config;
|
|
[self createBuffersWithConfig:config];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)createBuffersWithConfig:(QGAnimatedImageDecodeConfig *)config {
|
|
_buffers = [[QGVAPSafeMutableArray alloc] initWithCapacity:config.bufferCount];
|
|
}
|
|
|
|
/**
|
|
取出指定的在缓冲区的帧,若不存在于缓冲区则返回空
|
|
|
|
@param frameIndex 目标帧索引
|
|
@return 帧数据
|
|
*/
|
|
- (QGBaseAnimatedImageFrame *)getBufferedFrame:(NSInteger)frameIndex {
|
|
|
|
if (_buffers.count == 0) {
|
|
//NSLog(@"fail buffer is nil");
|
|
return nil;
|
|
}
|
|
NSInteger bufferIndex = frameIndex%_buffers.count;
|
|
if (bufferIndex > _buffers.count-1) {
|
|
//NSLog(@"fail");
|
|
return nil;
|
|
}
|
|
id frame = [_buffers objectAtIndex:bufferIndex];
|
|
if (![frame isKindOfClass:[QGBaseAnimatedImageFrame class]] || ([(QGBaseAnimatedImageFrame*)frame frameIndex] != frameIndex)) {
|
|
return nil;
|
|
}
|
|
return frame;
|
|
}
|
|
|
|
- (QGBaseAnimatedImageFrame *)popVideoFrame {
|
|
if (!_buffers.count) {
|
|
return nil;
|
|
}
|
|
|
|
if (![_buffers.firstObject isKindOfClass:[QGBaseAnimatedImageFrame class]]) {
|
|
return nil;
|
|
}
|
|
|
|
QGBaseAnimatedImageFrame *frame = _buffers.firstObject;
|
|
[_buffers removeObjectAtIndex:0];
|
|
|
|
return frame;
|
|
}
|
|
|
|
/**
|
|
判断当前缓冲区是否被填满
|
|
|
|
@return 只有当缓冲区所有区域都被QGBaseAnimatedImageFrame类型的数据填满才算缓冲区满
|
|
*/
|
|
- (BOOL)isBufferFull {
|
|
|
|
__block BOOL isFull = YES;
|
|
[_buffers enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
|
if (![obj isKindOfClass:[QGBaseAnimatedImageFrame class]]) {
|
|
isFull = NO;
|
|
*stop = YES;
|
|
}
|
|
}];
|
|
return isFull;
|
|
}
|
|
|
|
- (void)dealloc {
|
|
|
|
}
|
|
|
|
@end
|