video_jbuff_jitterbuffer.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef VIDEO_JBUFF_JITTERBUFFER_H
  2. #define VIDEO_JBUFF_JITTERBUFFER_H
  3. #include "../adaptive_jitter_buffer/video_jbuff_defines.h"
  4. #include "../adaptive_jitter_buffer/video_jbuff_frame.h"
  5. #include "../adaptive_jitter_buffer/video_jbuff_framelist.h"
  6. #include <queue>
  7. namespace AJB {
  8. class JitterBuffer
  9. {
  10. private:
  11. class SequenceNumberLessThan {
  12. public:
  13. bool operator()(const uint16_t& sequence_number1,
  14. const uint16_t& sequence_number2) const {
  15. return IsNewerSequenceNumber(sequence_number2, sequence_number1);
  16. }
  17. };
  18. typedef std::set<uint16_t, SequenceNumberLessThan> SequenceNumberSet;
  19. /* frame rate */
  20. double _frameRate;
  21. double _lastFrameRate;
  22. double _avgFrameRate;
  23. std::queue<int64_t> _decodedFrameTime;
  24. FrameList _decodableFrames;
  25. FrameList _incompleteFrames;
  26. UnorderedFrameList _freeFrames;
  27. int _max_number_of_frames;
  28. int _num_consecutive_old_packets;
  29. DecodingState _last_decoded_state;
  30. // Holds the missing sequence numbers.
  31. SequenceNumberSet missing_sequence_numbers_;
  32. uint16_t latest_received_sequence_number_;
  33. VideoJBufferObserver observer_;
  34. void Flush();
  35. bool IsContinuousInState(const Frame& frame, DecodingState& decoding_state);
  36. bool IsContinuous(const Frame& frame) ;
  37. void FindAndInsertContinuousFrames(const Frame& new_frame);
  38. void FindAndInsertContinuousFramesWithState(const DecodingState& original_decoded_state);
  39. void CleanUpOldFrames() ;
  40. bool RecycleFramesUntilKeyFrame();
  41. void RecycleFrameBuffer(Frame* frame);
  42. bool TryToIncreaseJitterBufferSize();
  43. Frame * GetEmptyFrame();
  44. FrameBufferEnum GetBuffer(const uint32_t timestamp,
  45. Frame** frame,
  46. FrameList** frame_list);
  47. FrameBufferEnum InsertPacket(std::shared_ptr<Packet> packet);
  48. Frame *NextDecodableFrame() ;
  49. /*****MISSING LIST*****/
  50. uint16_t EstimatedLowSequenceNumber(const Frame *frame) const;
  51. int NonContinuousOrIncompleteDuration();
  52. bool UpdateMissingList(uint16_t sequence_number);
  53. bool TooLargeMissingList() const;
  54. bool HandleTooLargeMissingList();
  55. bool MissingTooOldPacket(uint16_t latest_sequence_number) const;
  56. bool HandleTooOldPackets(uint16_t latest_sequence_number);
  57. void DropPacketsFromMissingList(uint16_t last_decoded_sequence_number);
  58. public:
  59. JitterBuffer(VideoJBufferObserver *observer);
  60. FrameBufferEnum ReceivePacket(const char* buffer, VideoJBufferPacketInfo *packet_info);
  61. double FrameRate() const { return _frameRate; }
  62. double AverageFrameRate() const { return _avgFrameRate; }
  63. double BufferSize() const { return _decodableFrames.size(); }
  64. void GetFrame();
  65. /*****MISSING LIST*****/
  66. std::vector<uint16_t> GetMissingList(int* request_key_frame);
  67. ~JitterBuffer();
  68. };
  69. }
  70. #endif /* VIDEO_JBUFF_JITTERBUFFER_H */