void cParserH264::Parse(sStreamPacket *pkt) { if (m_PesBufferPtr < 4) return; int p = m_PesParserPtr; uint32_t startcode = m_StartCode; bool frameComplete = false; int l; while ((l = m_PesBufferPtr - p) > 3) { if ((startcode & 0xffffff00) == 0x00000100) { if (Parse_H264(startcode, p, frameComplete) < 0) { break; } } startcode = startcode << 8 | m_PesBuffer[p++]; } m_PesParserPtr = p; m_StartCode = startcode; if (frameComplete) { if (!m_NeedSPS && !m_NeedIFrame) { double PAR = (double)m_PixelAspect.num/(double)m_PixelAspect.den; double DAR = (PAR * m_Width) / m_Height; DEBUGLOG("H.264 SPS: PAR %i:%i", m_PixelAspect.num, m_PixelAspect.den); DEBUGLOG("H.264 SPS: DAR %.2f", DAR); if (m_FpsScale == 0) { if (m_curDTS != DVD_NOPTS_VALUE && m_prevDTS != DVD_NOPTS_VALUE) m_FpsScale = m_Stream->Rescale(m_curDTS - m_prevDTS, DVD_TIME_BASE, 90000); else m_FpsScale = 40000; } bool streamChange = m_Stream->SetVideoInformation(m_FpsScale, DVD_TIME_BASE, m_Height, m_Width, DAR); int duration; if (m_curDTS != DVD_NOPTS_VALUE && m_prevDTS != DVD_NOPTS_VALUE) duration = m_curDTS - m_prevDTS; else duration = m_Stream->Rescale(m_FpsScale, 90000, DVD_TIME_BASE); pkt->id = m_pID; pkt->size = m_PesNextFramePtr; pkt->data = m_PesBuffer; pkt->dts = m_DTS; pkt->pts = m_PTS; pkt->duration = duration; pkt->streamChange = streamChange; } m_StartCode = 0xffffffff; m_PesParserPtr = 0; m_FoundFrame = false; } }
void cParserH264::Parse(unsigned char *data, int size, bool pusi) { uint32_t startcode = m_StartCond; if (m_pictureBuffer == NULL) { m_pictureBufferSize = 80000; m_pictureBuffer = (uint8_t*)malloc(m_pictureBufferSize); } if (m_pictureBufferPtr + size + 4 >= m_pictureBufferSize) { m_pictureBufferSize += size * 4; m_pictureBuffer = (uint8_t*)realloc(m_pictureBuffer, m_pictureBufferSize); } for (int i = 0; i < size; i++) { m_pictureBuffer[m_pictureBufferPtr++] = data[i]; startcode = startcode << 8 | data[i]; if ((startcode & 0xffffff00) != 0x00000100) continue; bool reset = true; if (m_pictureBufferPtr - 4 > 0 && m_StartCode != 0) { reset = Parse_H264(m_pictureBufferPtr - 4, startcode, m_StartCodeOffset); } if (reset) { /* Reset packet parser upon length error or if parser tells us so */ m_pictureBufferPtr = 0; m_pictureBuffer[m_pictureBufferPtr++] = startcode >> 24; m_pictureBuffer[m_pictureBufferPtr++] = startcode >> 16; m_pictureBuffer[m_pictureBufferPtr++] = startcode >> 8; m_pictureBuffer[m_pictureBufferPtr++] = startcode >> 0; } m_StartCode = startcode; m_StartCodeOffset = m_pictureBufferPtr - 4; } m_StartCond = startcode; }