Advertisement
tralph11

Untitled

Apr 6th, 2011
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.50 KB | None | 0 0
  1. diff --git a/mythtv/libs/libmythtv/videobuffers.cpp b/mythtv/libs/libmythtv/videobuffers.cpp
  2. index f84e4fb..7d05bab 100644
  3. --- a/mythtv/libs/libmythtv/videobuffers.cpp
  4. +++ b/mythtv/libs/libmythtv/videobuffers.cpp
  5. @@ -193,6 +193,7 @@ void VideoBuffers::Reset()
  6. available.clear();
  7. used.clear();
  8. limbo.clear();
  9. + done.clear();
  10. pause.clear();
  11. displayed.clear();
  12. vbufferMap.clear();
  13. @@ -231,6 +232,13 @@ VideoFrame *VideoBuffers::GetNextFreeFrameInternal(BufferType enqueue_to)
  14. frame = available.dequeue();
  15. }
  16.  
  17. + if (used.contains(frame))
  18. + VERBOSE(VB_IMPORTANT, QString("ERROR: frame %1 in used queue").arg((long long)frame));
  19. + if (limbo.contains(frame))
  20. + VERBOSE(VB_IMPORTANT, QString("ERROR: frame %1 in limbo queue").arg((long long)frame));
  21. + if (decode.contains(frame))
  22. + VERBOSE(VB_IMPORTANT, QString("ERROR: frame %1 in decode queue").arg((long long)frame));
  23. +
  24. if (frame)
  25. safeEnqueue(enqueue_to, frame);
  26.  
  27. @@ -285,7 +293,7 @@ void VideoBuffers::ReleaseFrame(VideoFrame *frame)
  28. QMutexLocker locker(&global_lock);
  29.  
  30. vpos = vbufferMap[frame];
  31. - limbo.remove(frame);
  32. +// limbo.remove(frame);
  33. decode.enqueue(frame);
  34. used.enqueue(frame);
  35. }
  36. @@ -301,7 +309,6 @@ void VideoBuffers::DeLimboFrame(VideoFrame *frame)
  37. if (limbo.contains(frame))
  38. {
  39. limbo.remove(frame);
  40. - available.enqueue(frame);
  41. }
  42.  
  43. // BEGIN HACK HACK HACK, see trac ticket #4159
  44. @@ -333,7 +340,18 @@ void VideoBuffers::DoneDisplayingFrame(VideoFrame *frame)
  45. if(used.contains(frame))
  46. {
  47. remove(kVideoBuffer_used, frame);
  48. - enqueue(kVideoBuffer_avail, frame);
  49. + }
  50. + enqueue(kVideoBuffer_done, frame);
  51. + frame_queue_t ula(done);
  52. + frame_queue_t::iterator it = ula.begin();
  53. + // check if any done frames are out of limbo and can be made available again
  54. + for (; it != ula.end(); ++it)
  55. + {
  56. + if (!limbo.contains(*it))
  57. + {
  58. + remove(kVideoBuffer_done, *it);
  59. + enqueue(kVideoBuffer_avail, *it);
  60. + }
  61. }
  62. }
  63.  
  64. @@ -366,6 +384,8 @@ frame_queue_t *VideoBuffers::queue(BufferType type)
  65. q = &pause;
  66. else if (type == kVideoBuffer_decode)
  67. q = &decode;
  68. + else if (type == kVideoBuffer_done)
  69. + q = &done;
  70.  
  71. return q;
  72. }
  73. @@ -388,6 +408,8 @@ const frame_queue_t *VideoBuffers::queue(BufferType type) const
  74. q = &pause;
  75. else if (type == kVideoBuffer_decode)
  76. q = &decode;
  77. + else if (type == kVideoBuffer_done)
  78. + q = &done;
  79.  
  80. return q;
  81. }
  82. @@ -470,6 +492,8 @@ void VideoBuffers::remove(BufferType type, VideoFrame *frame)
  83. pause.remove(frame);
  84. if ((type & kVideoBuffer_decode) == kVideoBuffer_decode)
  85. decode.remove(frame);
  86. + if ((type & kVideoBuffer_done) == kVideoBuffer_done)
  87. + done.remove(frame);
  88. }
  89.  
  90. void VideoBuffers::requeue(BufferType dst, BufferType src, int num)
  91. diff --git a/mythtv/libs/libmythtv/videobuffers.h b/mythtv/libs/libmythtv/videobuffers.h
  92. index 1e396c0..7bc4988 100644
  93. --- a/mythtv/libs/libmythtv/videobuffers.h
  94. +++ b/mythtv/libs/libmythtv/videobuffers.h
  95. @@ -41,7 +41,8 @@ enum BufferType
  96. kVideoBuffer_pause = 0x00000008,
  97. kVideoBuffer_displayed = 0x00000010,
  98. kVideoBuffer_decode = 0x00000020,
  99. - kVideoBuffer_all = 0x0000001F,
  100. + kVideoBuffer_done = 0x00000040,
  101. + kVideoBuffer_all = 0x0000001D,
  102. };
  103.  
  104. class YUVInfo
  105. @@ -133,7 +134,7 @@ class VideoBuffers
  106. const frame_queue_t *queue(BufferType type) const;
  107. VideoFrame *GetNextFreeFrameInternal(BufferType enqueue_to);
  108.  
  109. - frame_queue_t available, used, limbo, pause, displayed, decode;
  110. + frame_queue_t available, used, limbo, pause, displayed, decode, done;
  111. vbuffer_map_t vbufferMap; // videobuffers to buffer's index
  112. frame_vector_t buffers;
  113. uchar_vector_t allocated_structs; // for DeleteBuffers
  114. diff --git a/mythtv/libs/libmythtv/videoout_vdpau.cpp b/mythtv/libs/libmythtv/videoout_vdpau.cpp
  115. index 050ab2d..9ca0151 100644
  116. --- a/mythtv/libs/libmythtv/videoout_vdpau.cpp
  117. +++ b/mythtv/libs/libmythtv/videoout_vdpau.cpp
  118. @@ -913,7 +913,7 @@ void VideoOutputVDPAU::DiscardFrame(VideoFrame *frame)
  119. vbuffers.safeEnqueue(kVideoBuffer_displayed, frame);
  120. else
  121. {
  122. - vbuffers.DiscardFrame(frame);
  123. + vbuffers.DoneDisplayingFrame(frame);
  124. }
  125. m_lock.unlock();
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement