live555 client多线程化
2014-03-11 22:18:54 
为了让live555 client在线程中使用,就必须让env/task之类的独立化。做法是把相关的内容放在一个class内,必要的地方lock就好了。
一、大概
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | //global,live555库的一些基本类struct MYRTSPClient{ TaskScheduler* pTaskScheduler; UsageEnvironment* pEnv; RTSPClient* pClient; MediaSession *pMediaSession; MediaSubsessionIterator *iter; Boolean bMadeProgress; unsigned fileSinkBufferSize; unsigned socketInputBufferSize; Boolean bStreamUsingTCP; Authenticator* pAuthenticator; char m_cEventLoop; ploginfo pLogInfo; MYRTSPClient() { pClient = NULL; pMediaSession = NULL; iter = NULL; bMadeProgress = False; fileSinkBufferSize = MAX_VGA_LEN; socketInputBufferSize = 524288; bStreamUsingTCP = False; pAuthenticator = NULL; m_cEventLoop = 0; pLogInfo = new loginfo(); } MYRTSPClient(RTSPClient *client) { pClient = client; pMediaSession = NULL; iter = NULL; bMadeProgress = False; fileSinkBufferSize = MAX_VGA_LEN; socketInputBufferSize = 524288; bStreamUsingTCP = False; pAuthenticator = NULL; m_cEventLoop = 0; pLogInfo = new loginfo(); }}; |
二、细节
live555中有太多的static func,初衷是为了方便客户不必关心类就可以定制自己的需求。但在多线程环境中,就要考虑了,static func要么可重入(幸运的是live555的static func都是可重入的),要么在具有"类原子操作"的地方加锁。
从重要的static func说起。
1、static void afterGetting(FramedSource* source)
1 2 3 4 5 6 | class FramedSource: public MediaSource {static void afterGetting(FramedSource* source); // doGetNextFrame() should arrange for this to be called after the // frame has been read (*iff* it is read successfully)} |

浙公网安备 33010602011771号