Ticket #4758: 4758-v1.patch
File 4758-v1.patch, 7.7 KB (added by , 16 years ago) |
---|
-
libs/libmythtv/videoout_null.cpp
12 12 const int kPrebufferFramesSmall = 4; 13 13 const int kKeepPrebuffer = 2; 14 14 15 VideoOutputNull::VideoOutputNull(void) 16 : VideoOutput()15 VideoOutputNull::VideoOutputNull(void) : 16 VideoOutput(), global_lock(true) 17 17 { 18 18 VERBOSE(VB_PLAYBACK, "VideoOutputNull()"); 19 XJ_started = 0; 20 21 pauseFrame.buf = NULL; 19 memset(&av_pause_frame, 0, sizeof(av_pause_frame)); 22 20 } 23 21 24 22 VideoOutputNull::~VideoOutputNull() 25 23 { 26 24 VERBOSE(VB_PLAYBACK, "~VideoOutputNull()"); 27 if (pauseFrame.buf) 28 delete [] pauseFrame.buf; 25 QMutexLocker locker(&global_lock); 29 26 30 Exit(); 27 vbuffers.LockFrame(&av_pause_frame, "DeletePauseFrame"); 28 if (av_pause_frame.buf) 29 { 30 delete [] av_pause_frame.buf; 31 memset(&av_pause_frame, 0, sizeof(av_pause_frame)); 32 } 33 vbuffers.UnlockFrame(&av_pause_frame, "DeletePauseFrame"); 34 35 vbuffers.DeleteBuffers(); 31 36 } 32 37 33 38 // this is documented in videooutbase.cpp 34 39 void VideoOutputNull::Zoom(ZoomDirection direction) 35 40 { 41 QMutexLocker locker(&global_lock); 36 42 VideoOutput::Zoom(direction); 37 43 MoveResize(); 38 44 } 39 45 46 void VideoOutputNull::CreatePauseFrame(void) 47 { 48 vbuffers.LockFrame(&av_pause_frame, "CreatePauseFrame"); 49 50 if (av_pause_frame.buf) 51 { 52 delete [] av_pause_frame.buf; 53 av_pause_frame.buf = NULL; 54 } 55 56 init(&av_pause_frame, FMT_YV12, 57 new unsigned char[vbuffers.GetScratchFrame()->size + 128], 58 vbuffers.GetScratchFrame()->width, 59 vbuffers.GetScratchFrame()->height, 60 vbuffers.GetScratchFrame()->bpp, 61 vbuffers.GetScratchFrame()->size); 62 63 av_pause_frame.frameNumber = vbuffers.GetScratchFrame()->frameNumber; 64 65 clear(&av_pause_frame, GUID_I420_PLANAR); 66 67 vbuffers.UnlockFrame(&av_pause_frame, "CreatePauseFrame"); 68 } 69 40 70 bool VideoOutputNull::InputChanged(const QSize &input_size, 41 71 float aspect, 42 72 MythCodecID av_codec_id, … … 47 77 .arg(input_size.width()) 48 78 .arg(input_size.height()).arg(aspect)); 49 79 80 QMutexLocker locker(&global_lock); 81 50 82 VideoOutput::InputChanged(input_size, aspect, av_codec_id, codec_private); 51 83 52 84 if (input_size.width() == vbuffers.GetScratchFrame()->width && 53 85 input_size.height() == vbuffers.GetScratchFrame()->height) 54 86 { 87 vbuffers.Clear(GUID_I420_PLANAR); 55 88 MoveResize(); 56 89 return true; 57 90 } 58 91 59 92 video_dim = input_size; 60 93 94 vbuffers.DiscardFrames(true); 61 95 vbuffers.DeleteBuffers(); 62 96 63 97 MoveResize(); … … 68 102 "Failed to recreate buffers"); 69 103 errored = true; 70 104 } 105 CreatePauseFrame(); 71 106 72 107 db_vdisp_profile->SetVideoRenderer("null"); 73 108 74 if (pauseFrame.buf)75 delete [] pauseFrame.buf;76 77 pauseFrame.height = vbuffers.GetScratchFrame()->height;78 pauseFrame.width = vbuffers.GetScratchFrame()->width;79 pauseFrame.bpp = vbuffers.GetScratchFrame()->bpp;80 pauseFrame.size = vbuffers.GetScratchFrame()->size;81 pauseFrame.buf = new unsigned char[pauseFrame.size];82 pauseFrame.frameNumber = vbuffers.GetScratchFrame()->frameNumber;83 84 109 return true; 85 110 } 86 111 … … 96 121 if ((width <= 0) || (height <= 0)) 97 122 return false; 98 123 124 QMutexLocker locker(&global_lock); 125 99 126 vbuffers.Init(kNumBuffers, true, kNeedFreeFrames, 100 127 kPrebufferFramesNormal, kPrebufferFramesSmall, 101 128 kKeepPrebuffer); … … 106 133 107 134 if (!vbuffers.CreateBuffers(width, height)) 108 135 return false; 136 CreatePauseFrame(); 109 137 110 138 db_vdisp_profile->SetVideoRenderer("null"); 111 139 112 pauseFrame.height = vbuffers.GetScratchFrame()->height;113 pauseFrame.width = vbuffers.GetScratchFrame()->width;114 pauseFrame.bpp = vbuffers.GetScratchFrame()->bpp;115 pauseFrame.size = vbuffers.GetScratchFrame()->size;116 pauseFrame.buf = new unsigned char[pauseFrame.size];117 pauseFrame.frameNumber = vbuffers.GetScratchFrame()->frameNumber;118 119 140 MoveResize(); 120 XJ_started = true;121 141 122 142 return true; 123 143 } 124 144 125 void VideoOutputNull::Exit(void)126 {127 if (XJ_started)128 {129 XJ_started = false;130 131 vbuffers.DeleteBuffers();132 }133 }134 135 145 void VideoOutputNull::EmbedInWidget(WId wid, int x, int y, int w, int h) 136 146 { 137 if (embedding) 138 return; 139 140 VideoOutput::EmbedInWidget(wid, x, y, w, h); 147 QMutexLocker locker(&global_lock); 148 if (!embedding) 149 VideoOutput::EmbedInWidget(wid, x, y, w, h); 141 150 } 142 151 143 152 void VideoOutputNull::StopEmbedding(void) 144 153 { 145 if (!embedding) 146 return; 147 148 VideoOutput::StopEmbedding(); 154 QMutexLocker locker(&global_lock); 155 if (embedding) 156 VideoOutput::StopEmbedding(); 149 157 } 150 158 151 159 void VideoOutputNull::PrepareFrame(VideoFrame *buffer, FrameScanType t) … … 155 163 if (!buffer) 156 164 buffer = vbuffers.GetScratchFrame(); 157 165 166 vbuffers.LockFrame(buffer, "PrepareFrame"); 158 167 framesPlayed = buffer->frameNumber + 1; 168 vbuffers.UnlockFrame(buffer, "PrepareFrame"); 159 169 } 160 170 161 171 void VideoOutputNull::Show(FrameScanType ) … … 168 178 169 179 void VideoOutputNull::UpdatePauseFrame(void) 170 180 { 171 VideoFrame *pauseb = vbuffers.GetScratchFrame(); 172 VideoFrame *pauseu = vbuffers.head(kVideoBuffer_used); 173 if (pauseu) 174 memcpy(pauseFrame.buf, pauseu->buf, pauseu->size); 175 else 176 memcpy(pauseFrame.buf, pauseb->buf, pauseb->size); 181 QMutexLocker locker(&global_lock); 182 183 // Try used frame first, then fall back to scratch frame. 184 vbuffers.LockFrame(&av_pause_frame, "UpdatePauseFrame -- pause"); 185 186 vbuffers.begin_lock(kVideoBuffer_used); 187 VideoFrame *used_frame = NULL; 188 if (vbuffers.size(kVideoBuffer_used) > 0) 189 { 190 used_frame = vbuffers.head(kVideoBuffer_used); 191 if (!vbuffers.TryLockFrame(used_frame, "UpdatePauseFrame -- used")) 192 used_frame = NULL; 193 } 194 if (used_frame) 195 { 196 CopyFrame(&av_pause_frame, used_frame); 197 vbuffers.UnlockFrame(used_frame, "UpdatePauseFrame -- used"); 198 } 199 vbuffers.end_lock(); 200 201 if (!used_frame && 202 vbuffers.TryLockFrame(vbuffers.GetScratchFrame(), 203 "UpdatePauseFrame -- scratch")) 204 { 205 vbuffers.GetScratchFrame()->frameNumber = framesPlayed - 1; 206 CopyFrame(&av_pause_frame, vbuffers.GetScratchFrame()); 207 vbuffers.UnlockFrame(vbuffers.GetScratchFrame(), 208 "UpdatePauseFrame -- scratch"); 209 } 210 vbuffers.UnlockFrame(&av_pause_frame, "UpdatePauseFrame - used"); 177 211 } 178 212 179 213 void VideoOutputNull::ProcessFrame(VideoFrame *frame, OSD *osd, -
libs/libmythtv/videoout_null.h
1 1 #ifndef VIDEOOUT_NULL_H_ 2 2 #define VIDEOOUT_NULL_H_ 3 3 4 #include <qmutex.h> 5 4 6 #include "videooutbase.h" 5 7 6 8 class VideoOutputNull : public VideoOutput … … 18 20 void PrepareFrame(VideoFrame *buffer, FrameScanType); 19 21 void Show(FrameScanType ); 20 22 23 void CreatePauseFrame(void); 21 24 bool InputChanged(const QSize &input_size, 22 25 float aspect, 23 26 MythCodecID av_codec_id, … … 40 43 const QSize &video_dim); 41 44 42 45 private: 43 void Exit(void); 44 45 bool XJ_started; 46 47 VideoFrame pauseFrame; 46 QMutex global_lock; 47 VideoFrame av_pause_frame; 48 48 }; 49 49 50 50 #endif