packet.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "packet.h"
  2. int packet_queue_init(packet_queue_t *q, play_logfun playlog)
  3. {
  4. memset(q, 0, sizeof(packet_queue_t));
  5. q->mutex = SDL_CreateMutex();
  6. if (!q->mutex)
  7. {
  8. playlog("SDL_CreateMutex(): %s.", SDL_GetError());
  9. return AVERROR(ENOMEM);
  10. }
  11. q->cond = SDL_CreateCond();
  12. if (!q->cond)
  13. {
  14. playlog("SDL_CreateCond(): %s.", SDL_GetError());
  15. return AVERROR(ENOMEM);
  16. }
  17. q->abort_request = 0;
  18. return 0;
  19. }
  20. // 写队列尾部。pkt是一包还未解码的音频数据
  21. int packet_queue_put(packet_queue_t *q, AVPacket *pkt, play_logfun playlog)
  22. {
  23. AVPacketList *pkt_list;
  24. if (av_packet_make_refcounted(pkt) < 0)
  25. {
  26. playlog("[pkt] is not refrence counted.");
  27. return -1;
  28. }
  29. pkt_list = (AVPacketList*)av_malloc(sizeof(AVPacketList));
  30. if (!pkt_list)
  31. {
  32. return -1;
  33. }
  34. pkt_list->pkt = *pkt;
  35. pkt_list->next = NULL;
  36. SDL_LockMutex(q->mutex);
  37. if (!q->last_pkt) // 队列为空
  38. {
  39. q->first_pkt = pkt_list;
  40. }
  41. else
  42. {
  43. q->last_pkt->next = pkt_list;
  44. }
  45. q->last_pkt = pkt_list;
  46. q->nb_packets++;
  47. q->size += pkt_list->pkt.size;
  48. // 发个条件变量的信号:重启等待q->cond条件变量的一个线程
  49. SDL_CondSignal(q->cond);
  50. SDL_UnlockMutex(q->mutex);
  51. return 0;
  52. }
  53. // 读队列头部。
  54. int packet_queue_get(packet_queue_t *q, AVPacket *pkt, int block)
  55. {
  56. AVPacketList *p_pkt_node;
  57. int ret;
  58. SDL_LockMutex(q->mutex);
  59. while (1)
  60. {
  61. p_pkt_node = q->first_pkt;
  62. if (p_pkt_node) // 队列非空,取一个出来
  63. {
  64. //printf("packet queue is not empty, get one.");
  65. q->first_pkt = p_pkt_node->next;
  66. if (!q->first_pkt)
  67. {
  68. q->last_pkt = NULL;
  69. }
  70. q->nb_packets--;
  71. q->size -= p_pkt_node->pkt.size;
  72. *pkt = p_pkt_node->pkt;
  73. av_free(p_pkt_node);
  74. ret = 1;
  75. break;
  76. }
  77. else if (!block) // 队列空且阻塞标志无效,则立即退出
  78. {
  79. printf("packet queue is empty, and block flag is invalid, break.");
  80. ret = 0;
  81. break;
  82. }
  83. else // 队列空且阻塞标志有效,则等待
  84. {
  85. printf("packet queue is empty, and block flag is valid, continue wait.");
  86. SDL_CondWait(q->cond, q->mutex);
  87. }
  88. }
  89. SDL_UnlockMutex(q->mutex);
  90. return ret;
  91. }
  92. int packet_queue_put_nullpacket(packet_queue_t *q, int stream_index, play_logfun playlog)
  93. {
  94. AVPacket pkt1, *pkt = &pkt1;
  95. av_init_packet(pkt);
  96. pkt->data = NULL;
  97. pkt->size = 0;
  98. pkt->stream_index = stream_index;
  99. return packet_queue_put(q, pkt, playlog);
  100. }
  101. void packet_queue_flush(packet_queue_t *q)
  102. {
  103. AVPacketList *pkt, *pkt1;
  104. SDL_LockMutex(q->mutex);
  105. for (pkt = q->first_pkt; pkt; pkt = pkt1) {
  106. pkt1 = pkt->next;
  107. //av_packet_unref(&pkt->pkt);
  108. //av_freep(&pkt);
  109. }
  110. q->last_pkt = NULL;
  111. q->first_pkt = NULL;
  112. q->nb_packets = 0;
  113. q->size = 0;
  114. q->duration = 0;
  115. SDL_UnlockMutex(q->mutex);
  116. }
  117. void packet_queue_destroy(packet_queue_t *q)
  118. {
  119. packet_queue_flush(q);
  120. SDL_DestroyMutex(q->mutex);
  121. SDL_DestroyCond(q->cond);
  122. }
  123. void packet_queue_abort(packet_queue_t *q)
  124. {
  125. SDL_LockMutex(q->mutex);
  126. q->abort_request = 1;
  127. SDL_CondSignal(q->cond);
  128. SDL_UnlockMutex(q->mutex);
  129. }