diff options
author | scop <scop> | 2005-04-18 19:17:40 +0000 |
---|---|---|
committer | scop <scop> | 2005-04-18 19:17:40 +0000 |
commit | 37c4c7b0a4a388d6c933e95756ddd30dd0cca6fd (patch) | |
tree | 273ceb29e8631796f83b88e3a133dbab4ccbe2c7 /dxr3pesframe.c | |
parent | 4d4c6bb89da5b1cc3eff554412ea834337308cd5 (diff) | |
download | vdr-plugin-dxr3-37c4c7b0a4a388d6c933e95756ddd30dd0cca6fd.tar.gz vdr-plugin-dxr3-37c4c7b0a4a388d6c933e95756ddd30dd0cca6fd.tar.bz2 |
Add (X)Emacs indentation settings.
Diffstat (limited to 'dxr3pesframe.c')
-rw-r--r-- | dxr3pesframe.c | 322 |
1 files changed, 161 insertions, 161 deletions
diff --git a/dxr3pesframe.c b/dxr3pesframe.c index 0ee63dc..d0f265e 100644 --- a/dxr3pesframe.c +++ b/dxr3pesframe.c @@ -32,215 +32,215 @@ // ================================== bool cDxr3PesFrame::ExtractNextFrame(const uint8_t* pBuf, uint32_t length) throw (ePesFrameError) { - cDxr3SafeArray<uint8_t> pesArray((uint8_t*)pBuf, length); - uint32_t pos = 0; - m_pNextStart = pBuf; - m_remainingLength = length; + cDxr3SafeArray<uint8_t> pesArray((uint8_t*)pBuf, length); + uint32_t pos = 0; + m_pNextStart = pBuf; + m_remainingLength = length; - InitData(); + InitData(); - try + try + { + if (length > 9) { - if (length > 9) - { - for (; pos + 9 < length && !IsPesHeader(pesArray.SubArray(pos, 4)); pos++); - m_pPesStart = pBuf + pos; + for (; pos + 9 < length && !IsPesHeader(pesArray.SubArray(pos, 4)); pos++); + m_pPesStart = pBuf + pos; - if ((pesArray[pos + 6] & 0xC0) == 0x80 /*|| (pesArray[pos + 6] & 0xC0) == 0x00*/) + if ((pesArray[pos + 6] & 0xC0) == 0x80 /*|| (pesArray[pos + 6] & 0xC0) == 0x00*/) + { + if (pos + 9 + pesArray[pos + 8] < length) + { + m_pEsStart = pBuf + pos + 9 + pesArray[pos + 8]; + if ((((int)pesArray[pos + 4]) * (int)256 + (int)pesArray[pos + 5]) > 0) + { + m_esLength = ((int)pesArray[pos + 4]) * (int)256 + (int)pesArray[pos + 5] + (int)6 - (9 + (int)pesArray[pos + 8]); + if (pos + 9 + pesArray[pos + 8] + m_esLength <= length) { - if (pos + 9 + pesArray[pos + 8] < length) - { - m_pEsStart = pBuf + pos + 9 + pesArray[pos + 8]; - if ((((int)pesArray[pos + 4]) * (int)256 + (int)pesArray[pos + 5]) > 0) - { - m_esLength = ((int)pesArray[pos + 4]) * (int)256 + (int)pesArray[pos + 5] + (int)6 - (9 + (int)pesArray[pos + 8]); - if (pos + 9 + pesArray[pos + 8] + m_esLength <= length) - { - m_bValid = true; - m_pNextStart = m_pEsStart + m_esLength; - m_remainingLength = pBuf + length - (m_pEsStart + m_esLength); - if (pesArray[pos + 6] >> 6 == 2 && pesArray[pos + 7] >> 7 != 0) - { - ExtractPts(pesArray.SubArray(pos + 9, 5)); + m_bValid = true; + m_pNextStart = m_pEsStart + m_esLength; + m_remainingLength = pBuf + length - (m_pEsStart + m_esLength); + if (pesArray[pos + 6] >> 6 == 2 && pesArray[pos + 7] >> 7 != 0) + { + ExtractPts(pesArray.SubArray(pos + 9, 5)); } - if (m_pesDataType == PES_VIDEO_DATA) - { - int retval = ExtractVideoData(pesArray.SubArray(pos + 9 + pesArray[pos + 8], m_esLength)); - if (m_videoFrameType != UNKNOWN_FRAME && retval) m_offset = retval + pos + 9 + pesArray[pos + 8]; + if (m_pesDataType == PES_VIDEO_DATA) + { + int retval = ExtractVideoData(pesArray.SubArray(pos + 9 + pesArray[pos + 8], m_esLength)); + if (m_videoFrameType != UNKNOWN_FRAME && retval) m_offset = retval + pos + 9 + pesArray[pos + 8]; } } } } } - else - { - uint32_t fpos = pos + 6; - m_esLength = ((int)pesArray[pos + 4]) * (int)256 + (int)pesArray[pos + 5]; - if (length >= pos + 6 + m_esLength) - { - while (pesArray[fpos] == 0xff) ++fpos; // skip stuffing bytes - if ((pesArray[fpos] & 0xC0) == 0x40) fpos += 2; // skip std buffer scale and size - if ((pesArray[fpos] & 0xF0) == 0x20) - { - // pts only - ExtractPts(pesArray.SubArray(fpos, 5)); - fpos += 5; + else + { + uint32_t fpos = pos + 6; + m_esLength = ((int)pesArray[pos + 4]) * (int)256 + (int)pesArray[pos + 5]; + if (length >= pos + 6 + m_esLength) + { + while (pesArray[fpos] == 0xff) ++fpos; // skip stuffing bytes + if ((pesArray[fpos] & 0xC0) == 0x40) fpos += 2; // skip std buffer scale and size + if ((pesArray[fpos] & 0xF0) == 0x20) + { + // pts only + ExtractPts(pesArray.SubArray(fpos, 5)); + fpos += 5; } - else if ((pesArray[fpos] & 0xF0) == 0x30) - { - // pts and dts - ExtractPts(pesArray.SubArray(fpos, 5)); - fpos += 10; + else if ((pesArray[fpos] & 0xF0) == 0x30) + { + // pts and dts + ExtractPts(pesArray.SubArray(fpos, 5)); + fpos += 10; } - else - { - ++fpos; + else + { + ++fpos; } - if (m_esLength) m_esLength = m_esLength - (fpos - pos - 6); - m_pEsStart = pBuf + fpos; - m_pNextStart = m_pEsStart + m_esLength; - m_remainingLength = pBuf + length - (m_pEsStart + m_esLength); - m_bValid = true; - if (m_pesDataType == PES_VIDEO_DATA) - { - int retval = ExtractVideoData(pesArray.SubArray(fpos, m_esLength)); - if (m_videoFrameType != UNKNOWN_FRAME && retval) m_offset = 0; + if (m_esLength) m_esLength = m_esLength - (fpos - pos - 6); + m_pEsStart = pBuf + fpos; + m_pNextStart = m_pEsStart + m_esLength; + m_remainingLength = pBuf + length - (m_pEsStart + m_esLength); + m_bValid = true; + if (m_pesDataType == PES_VIDEO_DATA) + { + int retval = ExtractVideoData(pesArray.SubArray(fpos, m_esLength)); + if (m_videoFrameType != UNKNOWN_FRAME && retval) m_offset = 0; } } } } } - catch (cDxr3SafeArray<uint8_t>::eSafeArrayException ex) - { - m_bValid = false; - cLog::Instance() << "*** PES_GENERAL_ERROR ****\n"; - throw(PES_GENERAL_ERROR); + catch (cDxr3SafeArray<uint8_t>::eSafeArrayException ex) + { + m_bValid = false; + cLog::Instance() << "*** PES_GENERAL_ERROR ****\n"; + throw(PES_GENERAL_ERROR); } - return m_bValid; + return m_bValid; } // ================================== int cDxr3PesFrame::ExtractVideoData(cDxr3SafeArray<uint8_t> esFrame) throw (cDxr3SafeArray<uint8_t>::eSafeArrayException) { - int retval = 0; - for (uint32_t i = 0; esFrame.GetLength() > (uint32_t) 8 && i < esFrame.GetLength() - 8; i++) - { - if (esFrame[i] == 0 && esFrame[i+1] == 0 && esFrame[i+2] == 1) - { - // start code - if ((esFrame[i + 3] & 0xFF) == 0x00) - { - // extract frame type - if (m_offset == 0) retval = i - ; - switch ((esFrame[ i + 5] >> 3) & 0x7) - { - case 0x1: - m_videoFrameType = I_FRAME; - break; - - case 0x2: - m_videoFrameType = P_FRAME; - break; - - case 0x3: - m_videoFrameType = B_FRAME; - break; - - default: - m_videoFrameType = UNKNOWN_FRAME; - break; + int retval = 0; + for (uint32_t i = 0; esFrame.GetLength() > (uint32_t) 8 && i < esFrame.GetLength() - 8; i++) + { + if (esFrame[i] == 0 && esFrame[i+1] == 0 && esFrame[i+2] == 1) + { + // start code + if ((esFrame[i + 3] & 0xFF) == 0x00) + { + // extract frame type + if (m_offset == 0) retval = i + ; + switch ((esFrame[ i + 5] >> 3) & 0x7) + { + case 0x1: + m_videoFrameType = I_FRAME; + break; + + case 0x2: + m_videoFrameType = P_FRAME; + break; + + case 0x3: + m_videoFrameType = B_FRAME; + break; + + default: + m_videoFrameType = UNKNOWN_FRAME; + break; } } - else if ((esFrame[i + 3] & 0xFF) == 0xB3) - { - // aspect ratio - switch ((esFrame[i + 7]) & 0xF0) - { - case 0x20: - m_staticAspectRatio = m_aspectRatio = ASPECTRATIO_4_3; - break; - - case 0x30: - m_staticAspectRatio = m_aspectRatio = ASPECTRATIO_16_9; - break; - - default: - break; + else if ((esFrame[i + 3] & 0xFF) == 0xB3) + { + // aspect ratio + switch ((esFrame[i + 7]) & 0xF0) + { + case 0x20: + m_staticAspectRatio = m_aspectRatio = ASPECTRATIO_4_3; + break; + + case 0x30: + m_staticAspectRatio = m_aspectRatio = ASPECTRATIO_16_9; + break; + + default: + break; } - m_staticHorizontalSize = m_horizontalSize = (esFrame[i + 5] & 0xF0) >> 4 | esFrame[i + 4] << 4; - m_staticVerticalSize = m_verticalSize = ((esFrame[i + 5] & 0x0F) << 8) | (esFrame[i + 6]); + m_staticHorizontalSize = m_horizontalSize = (esFrame[i + 5] & 0xF0) >> 4 | esFrame[i + 4] << 4; + m_staticVerticalSize = m_verticalSize = ((esFrame[i + 5] & 0x0F) << 8) | (esFrame[i + 6]); } } } - return retval; + return retval; } // ================================== void cDxr3PesFrame::ExtractPts(cDxr3SafeArray<uint8_t> ptsData) throw (cDxr3SafeArray<uint8_t>::eSafeArrayException) { - m_pts = ((ptsData[0] >> 1) & 0x07) << 29; - m_pts |= ptsData[1] << 21; - m_pts |= (ptsData[2] >> 1) << 14; - m_pts |= ptsData[3] << 6; - m_pts |= ptsData[4] >> 2; + m_pts = ((ptsData[0] >> 1) & 0x07) << 29; + m_pts |= ptsData[1] << 21; + m_pts |= (ptsData[2] >> 1) << 14; + m_pts |= ptsData[3] << 6; + m_pts |= ptsData[4] >> 2; } // ================================== bool cDxr3PesFrame::IsPesHeader(cDxr3SafeArray<uint8_t> header) throw (cDxr3SafeArray<uint8_t>::eSafeArrayException) { - bool ret = false; + bool ret = false; - if (!header[0] && !header[1] && header[2] == 0x01 ) + if (!header[0] && !header[1] && header[2] == 0x01 ) + { + ret = true; + switch (header[3]) { - ret = true; - switch (header[3]) - { - case 0xC0 ... 0xDF: // audio stream - m_pesDataType = PES_AUDIO_DATA; - break; - - case 0xE0 ... 0xEF: // video stream - m_pesDataType = PES_VIDEO_DATA; - break; - - case 0xBD: // private stream 1 - m_pesDataType = PES_PRIVATE_DATA; - break; - - case 0xBA: - ret = false; - break; - - case 0xBE: // padding stream - ret = false; - break; - - case 0xBC: // program stream map - case 0xBF: // private stream 2 - case 0xF0: // ECM stream - case 0xF1: // EMM stream - case 0xF2: // DSMCC stream - case 0xF3: // 13522 stream - case 0xF4: // H.22.1 type A - case 0xF5: // H.22.1 type B - case 0xF6: // H.22.1 type C - case 0xF7: // H.22.1 type D - case 0xF8: // H.22.1 type E - case 0xF9: // ancillary stream - case 0xFA ... 0xFE: // reserved data stream - case 0xFF: // program stream directory - break; - default: - ret = false; - break; + case 0xC0 ... 0xDF: // audio stream + m_pesDataType = PES_AUDIO_DATA; + break; + + case 0xE0 ... 0xEF: // video stream + m_pesDataType = PES_VIDEO_DATA; + break; + + case 0xBD: // private stream 1 + m_pesDataType = PES_PRIVATE_DATA; + break; + + case 0xBA: + ret = false; + break; + + case 0xBE: // padding stream + ret = false; + break; + + case 0xBC: // program stream map + case 0xBF: // private stream 2 + case 0xF0: // ECM stream + case 0xF1: // EMM stream + case 0xF2: // DSMCC stream + case 0xF3: // 13522 stream + case 0xF4: // H.22.1 type A + case 0xF5: // H.22.1 type B + case 0xF6: // H.22.1 type C + case 0xF7: // H.22.1 type D + case 0xF8: // H.22.1 type E + case 0xF9: // ancillary stream + case 0xFA ... 0xFE: // reserved data stream + case 0xFF: // program stream directory + break; + default: + ret = false; + break; } - m_streamId = header[3]; + m_streamId = header[3]; } - return ret; + return ret; } // ================================== |