1. g_TSReceiver
  2. CTSReceiver::ThreadReceive
    1. TRSMSS_CONFIG* config = GetConfigByProcessId()
    2. recvfrom(...)
    3. ts_demuxer.TS_Parse(...)
    4. pAudio/VideoRecv->ForwardSample(...)
      1. samp=new CDataSample(...)
      2. CAudio/VideoTSSource::m_pAudio/VideoNode->PushSample((void*)samp)
        1. CAudio/VideoTranscoder::m_pQueueDecode->Push(pDataSample, 10000)
  3. CMediaSource
    1. CAudioTSSouce
    2. CVideoTSSource
    3. CMediaSource
      1. HANDLE m_handle ; int m_nIndex
      2. CMediaNode* m_pAudioNode, *m_pVideoNode
      3. media_info_t m_mediaInfo
      4. CMediaTrack m_mediaTracks
      5. MediaNodeState m_state
  4. CMediaFlow
    1. CMediaFlow
      1. media_info_t m_mediaInfo
      2. CMediaSource* m_pAudioSrc
      3. CMediaSource* m_pVideoSrc
      4. CTranscoder* m_pAudioTranscoder
      5. CTranscoder* m_pVideoTranscoder
      6. vector<CMediaSink*> m_mediasinks
  5. CMediaNode
    1. CTranscoder
      1. CMediaSource* m_mediasrc
      2. CMediaTrack m_trackInfo
      3. vector<CMediaSink*> m_mediasinks
      4. CDSIInfo m_dsiInfo
    2. CAudio/VideoTranscoder
      1. CDataQueue* m_pQueueDecode
      2. CSampleQueue* m_pQueueEncode
      3. CAVCEncoder* m_pEncoder
      4. AVC_FFMPEG_DECODER* m_pDecoder
      5. CThreadJob m_threadDecode, m_threadEncode
    3. Topic
    4. CMediaNode
      1. MediaNodeState m_stat
  6. CAudioTranscoder::ThreadDecode
    1. CDataQueue* pInputQ = pTrans->GetDecodeQ()
    2. CSampleQueue* pOutputQ = pTrans->GetEncodeQ()
    3. CDataSample* pInputBuffer = NULL
    4. UInt nOutputElemSize = pOutputQ->GetElemSize()
    5. AAC_DECODER* pDecoder = pTrans->GetDecoder()
    6. pInputQ->Pop(&pInputBuffer, nQueueTimeout)
    7. aac_frame->buffer_size = pInputBuffer->GetLen()
    8. pDecoder->Init_AAC(pInputBuffer->GetDataBuffer(), aac_frame)
    9. pDecoder->Decode_AAC(pInputBuffer->GetDataBuffer(), aac_frame, pOutputBuffer);
    10. pOutputQ->Push(&outputelem, 1000)
  7. CAudioTranscoder::ThreadEncode
    1. CSampleQueue* pInputQ = pTrans->GetEncodeQ()
    2. CBufferElem* pInputBuffer = new CBufferElem(pInputQ->GetElemSize()
    3. CEncoder* pEncoder = pTrans->GetEncoder()
    4. CAudioSample outsamp(pInputQ->GetElemSize())
    5. pInputQ->Pop(pInputBuffer, nQueueTimeout)
    6. pEncoder->EncodeFrame(pInputBuffer->m_data, ...)
    7. CMediaSink* pMediaSink = pTrans->GetMediaSink(nSinkIdx
    8. pMediaSink->PushSample(&outsamp)
      1. SendSink::sendto(...)
    9. pMediaSink = pTrans->GetMediaSink(++nSinkIdx)
  8. TS_DEMUXER
  9. CVideoTranscoder::ThreadDecode
  10. CVideoTranscoder::ThreadEncode
  11. CProcessInst
    1. StartTranscoding
      1. CMediaFlow*pMediaFlow = GetMediaFlow(media_info_t*)
      2. pMediaFlow->AddSource(CAudioTSSource)
      3. pMediaFlow->AddSource(CVideoTSSource)
      4. pMediaFlow->Start()
        1. CMediaFlow::StartSink()
        2. CMediaFlow::StartTranscoder()
          1. audio/video_transcoder->AddMediaSink(...)
          2. audio/video_transcoder->Start()
        3. CMediaFlow::StartSource()
          1. StartSource(A)/StartSource(V)
          2. CTranscoder* transcoder =GetTranscoder(A/V)
          3. CMediaSource* source =GetSource(A/V)
          4. Source->SetMediaNode(CTranscoder of A/V)
          5. Source->Start()
          6. CAudio/VideoTSSource::SetState(_MEDIA_STATE_START)
      5. g_TSReceiver = new CTSReceiver(pAudioSrc, pVideoSrc)
      6. g_TSReceiver->Start()
    2. InitTranscoding
      1. pMediaFlow = new CMediaFlow
      2. m_transcoderList.push_back(pMediaFlow)
      3. pMediaFlow->Init(pMediaInfo)
      4. pAudio/VideoTranscoder = new CAudio/VideoTranscoder(&audio/videoTrackOut)
      5. pMediaFlow->AddTranscoder(pAudio/VideoTranscoder, _MEDIA_TYPE_AUDIO/VIDEO)
      6. pSendSink = new SendSink
      7. pSendSink->Init(&sendParam)
      8. pMediaFlow->AddSink(pSendSink)
    3. Startup(void)
      1. CConfig::GetInstance()->Open()
  12. CTRSView::OnInitialUpdate()
    1. CTRSView::OnTranscodeInit()
      1. processing_init(media_info_t*, media_track_t*)
    2. CTRSView::OnTranscodeStart()
      1. processing_start(media_inf_t*, media_track_t*)