Browse Source

解决排序错乱问题

张禹 5 years ago
parent
commit
24dee37390

+ 15 - 17
iOS/QGVAPlayer/QGVAPlayer/Classes/Controllers/Decoders/QGMP4FrameHWDecoder.m

@@ -176,7 +176,8 @@ NSString *const QGMP4HWDErrorDomain = @"QGMP4HWDErrorDomain";
     if (_isFinish) {
     if (_isFinish) {
         return ;
         return ;
     }
     }
-    if (!_buffers || _buffers.count == 0) {
+    
+    if (!_buffers) {
         return ;
         return ;
     }
     }
     
     
@@ -193,6 +194,7 @@ NSString *const QGMP4HWDErrorDomain = @"QGMP4HWDErrorDomain";
         return;
         return;
     }
     }
     
     
+    // 获取当前帧pts,pts是在parse mp4 box时得到的
     uint64_t currentPts = [_mp4Parser.videoSamples[frameIndex] pts];
     uint64_t currentPts = [_mp4Parser.videoSamples[frameIndex] pts];
     
     
     CVPixelBufferRef outputPixelBuffer = NULL;
     CVPixelBufferRef outputPixelBuffer = NULL;
@@ -241,26 +243,19 @@ NSString *const QGMP4HWDErrorDomain = @"QGMP4HWDErrorDomain";
             // imagebuffer会在frame回收时释放
             // imagebuffer会在frame回收时释放
             CVPixelBufferRetain(imageBuffer);
             CVPixelBufferRetain(imageBuffer);
             newFrame.pixelBuffer = imageBuffer;
             newFrame.pixelBuffer = imageBuffer;
-            newFrame.frameIndex = frameIndex;
+            newFrame.frameIndex = frameIndex; //dts顺序
             NSTimeInterval decodeTime = [[NSDate date] timeIntervalSinceDate:startDate]*1000;
             NSTimeInterval decodeTime = [[NSDate date] timeIntervalSinceDate:startDate]*1000;
             newFrame.decodeTime = decodeTime;
             newFrame.decodeTime = decodeTime;
             newFrame.defaultFps =(int) strongSelf->_mp4Parser.fps;
             newFrame.defaultFps =(int) strongSelf->_mp4Parser.fps;
             newFrame.pts = currentPts;
             newFrame.pts = currentPts;
             
             
-            //8. insert into buffer
-            NSInteger index = frameIndex % (strongSelf->_buffers.count);
-            strongSelf->_buffers[index] = newFrame;
+            // 8. insert into buffer
+            [strongSelf->_buffers addObject:newFrame];
             
             
             // 9. sort
             // 9. sort
-//            [strongSelf->_buffers sortUsingComparator:^NSComparisonResult(QGMP4AnimatedImageFrame * _Nonnull obj1, QGMP4AnimatedImageFrame * _Nonnull obj2) {
-//                return [@(obj1.pts) compare:@(obj2.pts)];
-//            }];
-            
-//            if (frameIndex == 70) {
-//                for (int i = 0; i < strongSelf->_buffers.count; i++) {
-//                    NSLog(@"aarony - %lld", [strongSelf->_buffers[i] pts]);
-//                }
-//            }
+            [strongSelf->_buffers sortUsingComparator:^NSComparisonResult(QGMP4AnimatedImageFrame * _Nonnull obj1, QGMP4AnimatedImageFrame * _Nonnull obj2) {
+                return [@(obj1.pts) compare:@(obj2.pts)];
+            }];
         });
         });
     } else {
     } else {
         // 7. use VTDecompressionSessionDecodeFrame
         // 7. use VTDecompressionSessionDecodeFrame
@@ -282,10 +277,13 @@ NSString *const QGMP4HWDErrorDomain = @"QGMP4HWDErrorDomain";
         newFrame.decodeTime = decodeTime;
         newFrame.decodeTime = decodeTime;
         newFrame.defaultFps = (int)_mp4Parser.fps;
         newFrame.defaultFps = (int)_mp4Parser.fps;
         
         
+        // 8. insert into buffer
+        [_buffers addObject:newFrame];
         
         
-        //8. insert into buffer
-        NSInteger index = frameIndex%_buffers.count;
-        _buffers[index] = newFrame;
+        // 9. sort
+        [_buffers sortUsingComparator:^NSComparisonResult(QGMP4AnimatedImageFrame * _Nonnull obj1, QGMP4AnimatedImageFrame * _Nonnull obj2) {
+            return [@(obj1.pts) compare:@(obj2.pts)];
+        }];
     }
     }
 }
 }
 
 

+ 1 - 0
iOS/QGVAPlayer/QGVAPlayer/Classes/Controllers/QGAnimatedImageBufferManager.h

@@ -24,5 +24,6 @@
 - (instancetype)initWithConfig:(QGAnimatedImageDecodeConfig *)config;
 - (instancetype)initWithConfig:(QGAnimatedImageDecodeConfig *)config;
 - (QGBaseAnimatedImageFrame *)getBufferedFrame:(NSInteger)frameIndex;
 - (QGBaseAnimatedImageFrame *)getBufferedFrame:(NSInteger)frameIndex;
 - (BOOL)isBufferFull;
 - (BOOL)isBufferFull;
+- (QGBaseAnimatedImageFrame *)popVideoFrame;
 
 
 @end
 @end

+ 16 - 6
iOS/QGVAPlayer/QGVAPlayer/Classes/Controllers/QGAnimatedImageBufferManager.m

@@ -35,12 +35,7 @@
 }
 }
 
 
 - (void)createBuffersWithConfig:(QGAnimatedImageDecodeConfig *)config {
 - (void)createBuffersWithConfig:(QGAnimatedImageDecodeConfig *)config {
-    
-    _buffers = [QGVAPSafeMutableArray new];
-    for (int i = 0; i < config.bufferCount; i++) {
-        NSObject *frame = [NSObject new];
-        [_buffers addObject:frame];
-    }
+    _buffers = [[QGVAPSafeMutableArray alloc] initWithCapacity:config.bufferCount];
 }
 }
 
 
 /**
 /**
@@ -67,6 +62,21 @@
     return frame;
     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;
+}
+
 /**
 /**
  判断当前缓冲区是否被填满
  判断当前缓冲区是否被填满
  
  

+ 1 - 1
iOS/QGVAPlayer/QGVAPlayer/Classes/Controllers/QGAnimatedImageDecodeConfig.m

@@ -21,7 +21,7 @@
 
 
     QGAnimatedImageDecodeConfig *config = [QGAnimatedImageDecodeConfig new];
     QGAnimatedImageDecodeConfig *config = [QGAnimatedImageDecodeConfig new];
     config.threadCount= 1;
     config.threadCount= 1;
-    config.bufferCount = 1;
+    config.bufferCount = 5;
     return config;
     return config;
 }
 }
 
 

+ 8 - 5
iOS/QGVAPlayer/QGVAPlayer/Classes/Controllers/QGAnimatedImageDecodeManager.m

@@ -61,13 +61,16 @@
 - (QGBaseAnimatedImageFrame *)consumeDecodedFrame:(NSInteger)frameIndex {
 - (QGBaseAnimatedImageFrame *)consumeDecodedFrame:(NSInteger)frameIndex {
 
 
     @synchronized (self) {
     @synchronized (self) {
-        if (frameIndex==0 && ![_bufferManager isBufferFull]) {
+        // 控制何时命中第一帧,缓存满了才命中
+        if (frameIndex == 0 && _bufferManager.buffers.count < _config.bufferCount) {
             return nil;
             return nil;
         }
         }
         [self checkIfDecodeFinish:frameIndex];
         [self checkIfDecodeFinish:frameIndex];
-        QGBaseAnimatedImageFrame *frame = [_bufferManager getBufferedFrame:frameIndex];
-        if (frame && frame.frameIndex == frameIndex) {
-            [self decodeFrame:frame.frameIndex+_bufferManager.buffers.count];
+        QGBaseAnimatedImageFrame *frame = [_bufferManager popVideoFrame];
+        if (frame) {
+            // pts顺序
+            frame.frameIndex = frameIndex;
+            [self decodeFrame:frameIndex+_config.bufferCount];
         }
         }
         return frame;
         return frame;
     }
     }
@@ -133,7 +136,7 @@
 
 
 - (void)initializeBuffers {
 - (void)initializeBuffers {
     
     
-    for (int i = 0; i < _bufferManager.buffers.count; i++) {
+    for (int i = 0; i < _config.bufferCount; i++) {
         [self decodeFrame:i];
         [self decodeFrame:i];
     }
     }
 }
 }