Guest User

Untitled

a guest
Jul 28th, 2021
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | None | 0 0
  1.  
  2.  
  3.  
  4. class ios_video_track_impl : public video_track_impl
  5. {
  6. public:
  7.     // some assets loading management code / readers, outputs creation code
  8.  
  9.     /*
  10.         m_reader and m_reader_videotrack_output creates by code:
  11.         AVAssetReader* createAssetReader(AVAsset* asset)
  12.     {
  13.         NSError* error = nil;
  14.         AVAssetReader* assetReader = [AVAssetReader assetReaderWithAsset:asset error:&error];
  15.  
  16.         if (error) {
  17.             NSLog(@"Failed to ceate asset reader: %@", error);
  18.             return nil;
  19.         }
  20.  
  21.         NSDictionary* outputSettings = @{(NSString*) kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)};
  22.  
  23.         AVAssetReaderTrackOutput* readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[asset         tracksWithMediaType:AVMediaTypeVideo][0] outputSettings:outputSettings];
  24.         readerVideoTrackOutput.alwaysCopiesSampleData = NO;
  25.         readerVideoTrackOutput.supportsRandomAccess = YES;
  26.         [assetReader addOutput:readerVideoTrackOutput];
  27.  
  28.         return assetReader;
  29.     }
  30.     */
  31.  
  32.     frame request_next_frame()
  33.     {
  34.         if (m_next_buffer == nil) {
  35.                 m_curr_buffer.reset([m_reader_videotrack_output copyNextSampleBuffer]);
  36.             } else {
  37.                 m_curr_buffer = std::move(m_next_buffer);
  38.             }
  39.         }
  40.  
  41.         // some ts calculation logic
  42.  
  43.         m_next_buffer.reset([m_reader_videotrack_output copyNextSampleBuffer]);
  44.        
  45.         if (m_next_buffer == nil) {
  46.             // empty frame
  47.             return frame::create();
  48.         }
  49.  
  50.         return frame::create(std::move(m_curr_buffer);
  51.     }
  52.  
  53. private:
  54.     AVAsset* m_asset{nil};
  55.     AVAssetReader* m_reader{nil};
  56.     AVAssetReaderOutput* m_reader_videotrack_output{nil};
  57.  
  58.     CMSampleBufferRef m_curr_buffer{nil};
  59.     CMSampleBufferRef m_next_buffer{nil};
  60. };
  61.  
  62.  
  63. class video_track
  64. {
  65. public:
  66.     void update()
  67.     {
  68.         // some threads sync logic
  69.         frame new_frame = m_impl->request_next_frame();
  70.        
  71.         if (new_frame.is_empty() || m_frames_queue.size() > max_queue_size) {
  72.             return;
  73.         }
  74.        
  75.         m_frames_queue.push_front(m_impl->request_next_frame());
  76.     }
  77.  
  78.     frame dequeue_next_frame()
  79.     {
  80.         if (m_frames_queue.empty()) {
  81.             // empty frame
  82.             return frame::create();
  83.         }
  84.  
  85.         frame ret_frame = std::move(m_frames_queue.back());
  86.         m_frames_queue.pop_back();
  87.         return ret_frame;
  88.     }
  89.  
  90. private:
  91.     video_track_impl* m_impl;
  92.     inline static uint32_t max_queue_size = 3;
  93.     std::deque<frame> m_frames_queue{};
  94. };
  95.  
  96.  
  97. // -------------------- THREAD 1 --------------------
  98.  
  99. While (need_update){
  100.     for (track : m_tracks /* m_tracks is collection of video_track instances */) {
  101.         track.update();
  102.     }
  103. }
  104.  
  105.  
  106. // -------------------- THREAD 2 --------------------
  107.  
  108. /*
  109.         frame pixels are getting by:
  110.  
  111.         data_t get_pixel_data() const override
  112.         {
  113.             if (sample_buffer == nil) {
  114.                  // empty buffer
  115.                 return {};
  116.             }
  117.  
  118.             CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(m_sample_buffer.get());
  119.  
  120.             CVPixelBufferLockBaseAddress(movieFrame, 0);
  121.             void* pixels_data_ptr = CVPixelBufferGetBaseAddress(movieFrame);
  122.  
  123.             const auto bpr = CVPixelBufferGetBytesPerRow(movieFrame);
  124.             const auto h = CVPixelBufferGetHeight(movieFrame);
  125.  
  126.             return data_t::create_non_owning(static_cast<uint8_t*>(pixels_data_ptr), bpr * h, [movieFrame](uint8_t*) { CVPixelBufferUnlockBaseAddress(movieFrame, 0); });
  127.         }
  128.  
  129. */
  130.  
  131. While (need_update){
  132.     frame new_frame = m_track.dequeue_next_frame(); /* m_track is instance of video_track */
  133.     draw_frame(new_frame);
  134. }
  135.  
  136.  
  137.  
Advertisement
Add Comment
Please, Sign In to add comment