diff -r 951a5db380a0 -r e0b5df5c0969 videoeditorengine/h263decoder/src/sync.cpp --- a/videoeditorengine/h263decoder/src/sync.cpp Fri Jan 29 14:08:33 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,311 +0,0 @@ -/* -* Copyright (c) 2010 Ixonos Plc. -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - Initial contribution -* -* Contributors: -* Ixonos Plc -* -* Description: -* H.263 sync code functions. -* -*/ - - - - -#include "h263dConfig.h" - -#include "sync.h" -#include "errcodes.h" -#include "debug.h" -#include "biblin.h" - - - -/* - * Global functions - */ - -/* {{-output"sncCheckSync.txt"}} */ -/* - * sncCheckSync - * - * - * Parameters: - * buffer a pointer to a bit buffer structure - * numStuffBits the number of stuffing bits - * error error code - * - * Function: - * This function checks if the Picture Start Code (PSC), - * the End Of Sequence code (EOS) or the GOB synchronization code (GBSC) - * are the next codes in the bit buffer. - * Stuffing (PSTUF, ESTUF or GSTUF) is allowed before the code and - * the number of stuffing bits is returned in numStuffBits parameter. - * The code is not flushed from the buffer. - * - * Returns: - * SNC_NO_SYNC if no sync code is found - * SNC_PSC if PSC is found - * SNC_GBSC if GBSC is found - * SNC_EOS if EOS is found - * SNC_STUFFING if there are less than 8 zeros starting from - * the current position and after - * them the buffer ends - * - * Error codes: - * Error codes returned by bibFlushBits/bibGetBits/bibShowBits. - * - */ - -int sncCheckSync(bibBuffer_t *buffer, int *numStuffBits, int16 *error) -/* {{-output"sncCheckSync.txt"}} */ -{ - u_int32 result; - int numBitsGot, i; - int16 newError = 0; - int bitErrorIndication = 0; - - for(i = 0; i < 8; i++) { - bitErrorIndication = 0; - result = bibShowBits(i + 22, buffer, &numBitsGot, &bitErrorIndication, - &newError); - if (result == 32) { - /* PSC */ - *numStuffBits = i; - return SNC_PSC; - } - - else if (result == 63) { - /* EOS */ - *numStuffBits = i; - return SNC_EOS; - } - - else if (result > 32 && result < 63) { - /* GBSC */ - /* Notice that the allowed Group Numbers are listed in section 5.2.3 - of the H.263 recommendation. They are not checked here but rather - they are assumed to be checked in the corresponding header reading - function, e.g. vdxGetGOBHeader. */ - *numStuffBits = i; - return SNC_GBSC; - } - - else if (result >= 64) { - return SNC_NO_SYNC; - } - else if ( buffer->error ) - { - // out of bits - *error = (int16)buffer->error; - return SNC_NO_SYNC; - } - } - - return SNC_NO_SYNC; -} - - -/* {{-output"sncRewindAndSeekNewSync.txt"}} */ -/* - * sncRewindAndSeekNewSync - * - * - * Parameters: - * earliestBitPos location of previously found sync code - * so no sense to rewind over it - * buffer a pointer to a bit buffer structure - * error error code - * - * Function: - * This function is intended to be called after GOB header is corrupted. - * It rewinds some (already read) bits in order not to miss any sync code. - * Then, this function finds the next Picture Start Code (PSC), - * End Of Sequence code (EOS) or Group of Blocks Start Code (GBSC) - * The function discards the bits before the synchronization code - * but does not remove the found code from the buffer. - * - * Returns: - * SNC_NO_SYNC if no PSC, EOS either GBSC was found and - * no more bits are available - * SNC_PSC if PSC is found - * SNC_GBSC if GBSC is found - * SNC_EOS if EOS is found - * - * Error codes: - * Error codes returned by bibFlushBits/bibGetBits/bibShowBits. - * - */ - -int sncRewindAndSeekNewSync(u_int32 earliestBitPos, bibBuffer_t *buffer, - int16 *error) -/* {{-output"sncRewindAndSeekNewSync.txt"}} */ -{ - int sncCode; /* found sync code */ - u_int32 numRewindableBits; /* number of bits which can be rewinded */ - u_int32 bitPosBeforeRewinding; /* initial buffer bit index */ - u_int32 numBitsToRewind; /* number of bits to rewind before seeking the sync code */ - - *error = 0; - - bitPosBeforeRewinding = bibNumberOfFlushedBits(buffer); - - if ( bitPosBeforeRewinding > earliestBitPos+17 ) { - numBitsToRewind = bitPosBeforeRewinding - earliestBitPos - 17; - /* 17 is the sync code length, and one sync code exists in earliestBitPos => do not read it again */ - } - else if ( bitPosBeforeRewinding > earliestBitPos ) { - /* This might be possible in slice mode */ - numBitsToRewind = bitPosBeforeRewinding - earliestBitPos; - } - else { - /* Bit counter overrun? */ - numBitsToRewind = bitPosBeforeRewinding + (0xffffffff - earliestBitPos) - 17; - } - numRewindableBits = bibNumberOfRewBits(buffer); - - if (numRewindableBits < (u_int32) numBitsToRewind) - numBitsToRewind = (int) numRewindableBits; - - bibRewindBits(numBitsToRewind, buffer, error); - if (*error) - return SNC_NO_SYNC; - - /* Seek the next synchronization code */ - sncCode = sncSeekSync(buffer, error); - if (*error) - return sncCode; - - return sncCode; -} - - -/* {{-output"sncSeekFrameSync.txt"}} */ -/* - * sncSeekFrameSync - * - * - * Parameters: - * buffer a pointer to a bit buffer structure - * error error code - * - * Function: - * This function finds the next Picture Start Code (PSC) or - * End Of Sequence code (EOS) from the bit buffer. The function skips - * any other codes. It discards the bits before the found synchronization - * code but does not remove the found code from the buffer. - * - * Returns: - * SNC_NO_SYNC if no PSC or EOS was found and - * no more bits are available - * SNC_PSC if PSC is found - * SNC_EOS if EOS is found - * - * Error codes: - * Error codes returned by bibFlushBits/bibGetBits/bibShowBits. - * - */ - -int sncSeekFrameSync(bibBuffer_t *buffer, int16 *error) -/* {{-output"sncSeekFrameSync.txt"}} */ -{ - int numBitsGot, syncCode, bitErrorIndication = 0; - int16 newError = 0; - - for (;;) { - syncCode = sncSeekSync(buffer, &newError); - - if (newError) { - *error = newError; - return SNC_NO_SYNC; - } - - if (syncCode == SNC_GBSC) { - bibFlushBits(17, buffer, &numBitsGot, &bitErrorIndication, &newError); - } - - else - return syncCode; - } -} - - -/* {{-output"sncSeekSync.txt"}} */ -/* - * sncSeekSync - * - * - * Parameters: - * buffer a pointer to a bit buffer structure - * error error code - * - * Function: - * This function finds the next Picture Start Code (PSC), - * End Of Sequence code (EOS) or Group of Blocks Start Code (GBSC) - * from the bit buffer. It discards the bits before the synchronization - * code but does not remove the found code from the buffer. - * - * Returns: - * SNC_NO_SYNC if no PSC, EOS either GBSC was found and - * no more bits are available - * SNC_PSC if PSC is found - * SNC_GBSC if GBSC is found - * SNC_EOS if EOS is found - * - * Error codes: - * Error codes returned by bibFlushBits/bibGetBits/bibShowBits. - * - */ - -int sncSeekSync(bibBuffer_t *buffer, int16 *error) -/* {{-output"sncSeekSync.txt"}} */ -{ - u_int32 result; - int numBitsGot; - int16 newError = 0; - int bitErrorIndication = 0; - - for (;;) { - bitErrorIndication = 0; - result = bibShowBits(22, buffer, &numBitsGot, &bitErrorIndication, - &newError); - - - if (result == 32) { - /* PSC */ - return SNC_PSC; - } - - else if (result == 63) { - /* EOS */ - return SNC_EOS; - } - - else if (result > 32 && result < 63) { - /* GBSC */ - /* Notice that the allowed Group Numbers are listed in section 5.2.3 - of the H.263 recommendation. They are not checked here but rather - they are assumed to be checked in the corresponding header reading - function, e.g. vdxGetGOBHeader. */ - return SNC_GBSC; - } - else if ( buffer->error ) - { - // out of bits - *error = (int16)buffer->error; - return SNC_NO_SYNC; - } - - bibFlushBits(1, buffer, &numBitsGot, &bitErrorIndication, error); - } -} - -// End of file