aboutsummaryrefslogtreecommitdiff
path: root/Src/h264dec/ldecod/src/nal.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/h264dec/ldecod/src/nal.c')
-rw-r--r--Src/h264dec/ldecod/src/nal.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/Src/h264dec/ldecod/src/nal.c b/Src/h264dec/ldecod/src/nal.c
new file mode 100644
index 00000000..73c39474
--- /dev/null
+++ b/Src/h264dec/ldecod/src/nal.c
@@ -0,0 +1,123 @@
+
+/*!
+ ************************************************************************
+ * \file nal.c
+ *
+ * \brief
+ * Converts Encapsulated Byte Sequence Packets (EBSP) to Raw Byte
+ * Sequence Packets (RBSP), and then onto String Of Data Bits (SODB)
+ *
+ * \author
+ * Main contributors (see contributors.h for copyright, address and affiliation details)
+ * - Shankar L. Regunathan <shanre@microsoft.com>
+ * - Tobias Oelbaum <oelbaum@drehvial.de>
+************************************************************************
+ */
+
+#include "contributors.h"
+#include "global.h"
+
+ /*!
+ ************************************************************************
+ * \brief
+ * Converts RBSP to string of data bits
+ * \param streamBuffer
+ * pointer to buffer containing data
+ * \param last_byte_pos
+ * position of the last byte containing data.
+ * \return last_byte_pos
+ * position of the last byte pos. If the last-byte was entirely a stuffing byte,
+ * it is removed, and the last_byte_pos is updated.
+ *
+************************************************************************/
+
+int RBSPtoSODB(byte *streamBuffer, int last_byte_pos)
+{
+ int ctr_bit, bitoffset;
+
+ bitoffset = 0;
+ //find trailing 1
+ ctr_bit = (streamBuffer[last_byte_pos-1] & (0x01<<bitoffset)); // set up control bit
+
+ while (ctr_bit==0)
+ { // find trailing 1 bit
+ bitoffset++;
+ if(bitoffset == 8)
+ {
+ if(last_byte_pos == 0)
+ printf(" Panic: All zero data sequence in RBSP \n");
+ assert(last_byte_pos != 0);
+ last_byte_pos -= 1;
+ bitoffset = 0;
+ }
+ ctr_bit= streamBuffer[last_byte_pos-1] & (0x01<<(bitoffset));
+ }
+
+
+ // We keep the stop bit for now
+/* if (remove_stop)
+ {
+ streamBuffer[last_byte_pos-1] -= (0x01<<(bitoffset));
+ if(bitoffset == 7)
+ return(last_byte_pos-1);
+ else
+ return(last_byte_pos);
+ }
+*/
+ return(last_byte_pos);
+
+}
+
+
+/*!
+************************************************************************
+* \brief
+* Converts Encapsulated Byte Sequence Packets to RBSP
+* \param streamBuffer
+* pointer to data stream
+* \param end_bytepos
+* size of data stream
+* \param begin_bytepos
+* Position after beginning
+************************************************************************/
+
+// TODO: benski> optimize using BitScanReverse
+int EBSPtoRBSP(byte *streamBuffer, int end_bytepos)
+{
+ int i, j, count;
+ int begin_bytepos = 1;
+ count = 0;
+
+
+ if(end_bytepos < begin_bytepos)
+ return end_bytepos;
+
+ j = begin_bytepos;
+
+ for(i = begin_bytepos; i < end_bytepos; i++)
+ { //starting from begin_bytepos to avoid header information
+ //in NAL unit, 0x000000, 0x000001 or 0x000002 shall not occur at any byte-aligned position
+ if(count == ZEROBYTES_SHORTSTARTCODE && streamBuffer[i] < 0x03)
+ return j;//-1;
+ if(count == ZEROBYTES_SHORTSTARTCODE && streamBuffer[i] == 0x03)
+ {
+ //check the 4th byte after 0x000003, except when cabac_zero_word is used, in which case the last three bytes of this NAL unit must be 0x000003
+ if((i < end_bytepos-1) && (streamBuffer[i+1] > 0x03))
+ return -1;
+ //if cabac_zero_word is used, the final byte of this NAL unit(0x03) is discarded, and the last two bytes of RBSP must be 0x0000
+ if(i == end_bytepos-1)
+ return j;
+
+ i++;
+ count = 0;
+ }
+ streamBuffer[j] = streamBuffer[i];
+ if(streamBuffer[i] == 0x00)
+ count++;
+ else
+ count = 0;
+ j++;
+ }
+
+ return j;
+}