video_jbuff_api.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "../adaptive_jitter_buffer/video_jbuff_api.h"
  2. #include "../adaptive_jitter_buffer/video_jbuff_jitterbuffer.h"
  3. #include "../adaptive_jitter_buffer/video_jbuff_log.h"
  4. #include "../congestion_control/common/cf_platform.h"
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. const int TIME_INTERVAL = 10; // 10 ms
  9. const int GET_MISSING_TIME_INTERVAL = 200; // 200 ms
  10. struct _VideoJBufferApi {
  11. volatile int run_; /*run线程标示 */
  12. su_mutex mutex_; /*用于上层多线程操作的保护锁*/
  13. su_thread thr_; /*线程ID*/
  14. AJB::JitterBuffer *jitterBuffer_;
  15. VideoJBufferObserver observer_;
  16. int scheduleKeyRequest_;
  17. };
  18. static void* jitter_buffer_loop_event(void* arg);
  19. VideoJBufferApi *video_jbuffer_api_new(VideoJBufferObserver *observer, VideoJBufferLogCallBack *log_func){
  20. VideoJBufferApi *obj = (VideoJBufferApi *)malloc(sizeof(VideoJBufferApi));
  21. memset(obj, 0, sizeof(VideoJBufferApi));
  22. video_jitterbuffer_setup_log(log_func);
  23. obj->jitterBuffer_ = new AJB::JitterBuffer(observer);
  24. if (observer != NULL) {
  25. obj->observer_.OnReceiveEncodedImage = observer->OnReceiveEncodedImage;
  26. obj->observer_.RequestKeyFrame = observer->RequestKeyFrame;
  27. obj->observer_.userdata = observer->userdata;
  28. }
  29. obj->mutex_ = su_create_mutex();
  30. return obj;
  31. }
  32. void video_jbuffer_api_destroy(VideoJBufferApi *obj){
  33. if (obj != NULL) {
  34. if (obj->jitterBuffer_) {
  35. delete obj->jitterBuffer_;
  36. obj->jitterBuffer_ = NULL;
  37. }
  38. if (obj->mutex_) {
  39. su_destroy_mutex(obj->mutex_);
  40. }
  41. free(obj);
  42. }
  43. video_jitterbuffer_unsetup_log();
  44. }
  45. void video_jbuffer_api_start(VideoJBufferApi *obj){
  46. if (obj->jitterBuffer_) {
  47. obj->run_ = 1;
  48. obj->thr_ = su_create_thread(NULL, jitter_buffer_loop_event, obj);
  49. }
  50. }
  51. void video_jbuffer_api_stop(VideoJBufferApi *obj){
  52. obj->run_ = 0;
  53. while (obj->run_ == 0){
  54. su_sleep(0, 10000);
  55. }
  56. }
  57. void video_jbuffer_api_receive_packet(VideoJBufferApi *obj, const char* buffer, VideoJBufferPacketInfo *packet_info){
  58. if (obj->jitterBuffer_) {
  59. su_mutex_lock(obj->mutex_);
  60. FrameBufferEnum result = obj->jitterBuffer_->ReceivePacket(buffer, packet_info);
  61. if (result == kFlushIndicator) {
  62. obj->scheduleKeyRequest_ = true;
  63. }
  64. su_mutex_unlock(obj->mutex_);
  65. }
  66. }
  67. static void* jitter_buffer_loop_event(void* arg)
  68. {
  69. VideoJBufferApi* obj = (VideoJBufferApi*)arg;
  70. int64_t now_ts = 0, prev_ts = 0;
  71. int64_t prev_getmissing_ts = 0;
  72. prev_ts = now_ts = GET_SYS_MS();
  73. while (obj->run_ == 1){
  74. now_ts = GET_SYS_MS();
  75. if (now_ts >= prev_ts + TIME_INTERVAL){
  76. int request_key_frame = false;
  77. su_mutex_lock(obj->mutex_);
  78. if (now_ts >= prev_getmissing_ts + GET_MISSING_TIME_INTERVAL){
  79. obj->jitterBuffer_->GetMissingList(&request_key_frame);
  80. prev_getmissing_ts = now_ts;
  81. }
  82. if ((obj->scheduleKeyRequest_ || request_key_frame) && obj->observer_.RequestKeyFrame) {
  83. int result = obj->observer_.RequestKeyFrame(obj->observer_.userdata);
  84. obj->scheduleKeyRequest_ = false;
  85. }
  86. obj->jitterBuffer_->GetFrame();
  87. su_mutex_unlock(obj->mutex_);
  88. prev_ts = now_ts;
  89. }
  90. //video_jitterbuffer_debug("jitter_buffer_loop_event prev_ts: %I64d now_ts: %I64d.", prev_ts, now_ts);
  91. Sleep(3);
  92. //video_jitterbuffer_debug("jitter_buffer_loop_event after currentTime: %I64d.", now_ts);
  93. }
  94. obj->run_ = -1;
  95. return NULL;
  96. }
  97. #ifdef __cplusplus
  98. }
  99. #endif /* end of __cplusplus */