• 大小: 18.82MB
    文件类型: .gz
    金币: 1
    下载: 0 次
    发布日期: 2023-08-02
  • 语言: 其他
  • 标签: rtph264  

资源简介

接收RTP包保存为h264文件

资源截图

代码片段和文件信息

#include “H264Decoder.h“

enum PluginCodec_ReturnCoderFlags {
PluginCodec_ReturnCoderLastframe      = 1    // indicates when video codec returns last data for frame
PluginCodec_ReturnCoderiframe         = 2    // indicates when video returns I frame
PluginCodec_ReturnCoderRequestiframe  = 4    // indicates when video decoder request I frame for resync
PluginCodec_ReturnCoderBufferTooSmall = 8     // indicates when output buffer is not large enough to receive
// the data another call to get_output_data_size is required
};
 #define snprintf  _snprintf
H264Decoder::H264Decoder(int portIndex)
{
snprintf(ssName sizeof(ssName)
“main_decode_%d_%d_%d.264“ GetCurrentProcessId()GetCurrentThreadId()portIndex);
fp = fopen(ssName“wb+“);

_gotiframe = false;
_gotAGoodframe = false;
_frameCounter = 0; 
_skippedframeCounter = 0;
_rxH264frame = new H264frame();
//dong trace
//PTRACE(1NULL “H264Decoder“);
}

H264Decoder::~H264Decoder()
{
delete(_rxH264frame);
fflush(fp);
fclose(fp);

}

bool H264Decoder::Transcode(const void * fromPtr
  int & fromLen
  unsigned & flags)
{
RTPframe srcRTP((const u_char *)fromPtr fromLen);
if (!_rxH264frame->SetFromRTPframe(srcRTP flags)) {
_rxH264frame->BeginNewframe();
flags = (_gotAGoodframe ? requestiframe : 0);
_gotAGoodframe = false;
return true;
}
if (srcRTP.GetMarker()==0)
{
return true;

if (_rxH264frame->GetframeSize()==0)
{
_rxH264frame->BeginNewframe();
/*TRACE(4 “H264\tDecoder\tGot an empty frame - skipping“);*/
_skippedframeCounter++;
flags = (_gotAGoodframe ? requestiframe : 0);
_gotAGoodframe = false;
return true;
}
// look and see if we have read an I frame.
if (_gotiframe == 0)
{
if (!_rxH264frame->IsSync())
{
/*TRACE(1 “H264\tDecoder\tWaiting for an I-frame“);*/
_rxH264frame->BeginNewframe();
flags = (_gotAGoodframe ? requestiframe : 0);
_gotAGoodframe = false;
return true;
}
_gotiframe = 1;
}

uint32_t bytesUsed = 0;  

//ck to instead with 8168
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(_rxH264frame->Isgoodframe())
{
fwrite(_rxH264frame->GetframePtr() + bytesUsed_rxH264frame->GetframeSize() - bytesUsed1fp);
fflush(fp);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////

_rxH264frame->BeginNewframe();
int gotPicture = 1;
/*gotPicture used to show the decoder‘s status*/
if (!gotPicture) 
{
/*TRACE(1 “H264\tDecoder\tDecoded “<< bytesDecoded << “ bytes without getting a Picture...“); */
_skippedframeCounter++;
flags = (_gotAGoodframe ? requestiframe : 0);
_gotAGoodframe = false;
return true;
}

flags = PluginCodec_ReturnCoderLastframe;
_frameCounter++;
_gotAGoodframe = true;
return true;
}

评论

共有 条评论