--- a/videoeditorengine/h263decoder/src/viddemux_mpeg.cpp Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4687 +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:
-* MPEG-4 bitstream parsing.
-*
-*/
-
-
-/*
- * Includes
- */
-
-#include "h263dConfig.h"
-#include "viddemux.h"
-#include "vdxint.h"
-#include "mpegcons.h"
-#include "sync.h"
-#include "vdcaic.h"
-#include "zigzag.h"
-#include "debug.h"
-#include "biblin.h"
-/* MVE */
-#include "MPEG4Transcoder.h"
-// <--
-
-/*
- * Local function prototypes
- */
-
-/* Macroblock Layer */
-
-static int vdxGetIntraDCSize(bibBuffer_t *inBuffer, int compnum, int *IntraDCSize,
- int *bitErrorIndication);
-
-static int vdxGetRVLCIndex(u_int32 bits, u_int32 *index, int *length, int intra_luma,
- int *bitErrorIndication);
-
-
-/*
- * Picture Layer Global Functions
- */
-
-
-/*
- *
- * vdxGetVolHeader
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * header output parameters: VOL header
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function reads the VO and VOL header from inBuffer.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- * VDX_ERR_NO_START_CODE if start code is not found
- * VDX_ERR_NOT_SUPPORTED if VOL header
- *
- *
- */
-
-int vdxGetVolHeader(
- bibBuffer_t *inBuffer,
- vdxVolHeader_t *header,
- int *bitErrorIndication,
- int getInfo, int *aByteIndex, int *aBitIndex, CMPEG4Transcoder *hTranscoder)
-{
- int bitsGot, sncCode, fUseDefaultVBVParams = 0, num_bits;
- int16 bibError = 0;
- u_int32 bits;
-
- memset(header, 0, sizeof(vdxVolHeader_t));
- *bitErrorIndication = 0;
-
- /* if Visual Object Sequence Start Code is present */
- bits = bibShowBits(MP4_VOS_START_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits == MP4_VOS_START_CODE) {
-
- /* vos_start_code */
- bibFlushBits(MP4_VOS_START_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- /* profile_and_level_indication (8 bits) */
- bits = bibGetBits(8, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- /* If fatal bit error occurred (lost segment/packet etc.) */
- /*
- 1: Simple Profile Level 1 (from ISO/IEC 14496-2:1999/FPDAM4 [N4350] July 2001)
- 2: Simple Profile Level 2 (from ISO/IEC 14496-2:1999/FPDAM4 [N4350] July 2001)
- 3: Simple Profile Level 3 (from ISO/IEC 14496-2:1999/FPDAM4 [N4350] July 2001)
- 8: Simple Profile Level 0 (from ISO/IEC 14496-2:1999/FPDAM4 [N5743] July 2003)
- 9: Simple Profile Level 0b (from ISO/IEC 14496-2:1999/FPDAM4 [N5743] July 2003)
- */
-#if 0
- // Disabled since some clips have this set incorrectly, and this is not used for anything important.
- // Only simple profile clips seem to be available so this should not cause any harm.
- // Further, it is still checked in vedVolReader which is always used before editing. It is not checked only when creating thumbnails
-
-
- if (bits != 1 && bits != 2 && bits != 3 && bits != 8 && bits != 9) {
- /* this is not a supported simple profile stream */
- deb("vdxGetMPEGVolHeader: ERROR - This is not a supported simple profile stream\n");
- goto notSupported;
- }
-#endif
- if (bits != 8 && bits != 9)
- header->profile_level = (int) bits;
- else
- header->profile_level = 0;
-
- /* User data if available */
- bits = bibShowBits(32, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits == MP4_USER_DATA_START_CODE)
- {
- if (!header->user_data) {
- header->user_data = (char *) malloc(MAX_USER_DATA_LENGTH);
- header->user_data_length = 0;
- }
-
- if (vdxGetUserData(inBuffer, header->user_data, &(header->user_data_length), bitErrorIndication) != VDX_OK)
- /* also bibError will be handled in exitAfterBitError */
- goto exitAfterBitError;
- }
- }
-
- /* if Visual Object Start Code is present */
- bits = bibShowBits(MP4_VO_START_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits == MP4_VO_START_CODE) {
-
- /* visual_object_start_code */
- bibFlushBits(MP4_VO_START_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- /* is_visual_object_identifier (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
-
- /* visual_object_ver_id (4 bits) */
- bits = bibGetBits(4, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits != 1) {
- /* this is not an MPEG-4 version 1 stream */
- deb("vdxGetMPEGVolHeader: ERROR - This is not an MPEG-4 version 1 stream\n");
- goto notSupported;
- }
-
- /* visual_object_priority (3 bits) */
- bits = bibGetBits(3, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->vo_priority = (int) bits;
-
- } else {
- header->vo_priority = 0;
- }
-
- /* visual_object_type (4 bits) */
- bits = bibGetBits(4, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits != 1) {
- /* this is not a video object */
- deb("vdxGetMPEGVolHeader: ERROR - This is not a video object\n");
- goto notSupported;
- }
-
- /* is_video_signal_type (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
-
- /* Note: The following fields in the bitstream give information about the
- video signal type before encoding. These parameters don't influence the
- decoding algorithm, but the composition at the output of the video decoder.
- There is no normative requirement however to utilize this information
- during composition, therefore until a way to utilize them is found in
- MoViDe, these fields are just dummyly read, but not interpreted.
- For interpretation see the MPEG-4 Visual standard */
-
- /* video_format (3 bits) */
- bits = bibGetBits(3, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->video_format = (int) bits;
-
- /* video_range (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->video_range = (int) bits;
-
- /* colour_description (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
-
- /* colour_primaries (8 bits) */
- bits = bibGetBits(8, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->colour_primaries = (int) bits;
-
- /* transfer_characteristics (8 bits) */
- bits = bibGetBits(8, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->transfer_characteristics = (int) bits;
-
- /* matrix_coefficients (8 bits) */
- bits = bibGetBits(8, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->matrix_coefficients = (int) bits;
- } else {
-
- header->colour_primaries = 1; /* default: ITU-R BT.709 */
- header->transfer_characteristics = 1; /* default: ITU-R BT.709 */
- header->matrix_coefficients = 1; /* default: ITU-R BT.709 */
- }
-
- } else {
-
- /* default values */
- header->video_format = 5; /* Unspecified video format */
- header->video_range = 0; /* Y range 16-235 pixel values */
- header->colour_primaries = 1; /* ITU-R BT.709 */
- header->transfer_characteristics = 1; /* ITU-R BT.709 */
- header->matrix_coefficients = 1; /* ITU-R BT.709 */
- }
-
- /* check the next start code */
- sncCode = sncCheckMpegSync(inBuffer, 0, &bibError);
-
- /* If User data is available */
- if (sncCode == SNC_USERDATA)
- {
- if (!header->user_data) {
- header->user_data = (char *) malloc(MAX_USER_DATA_LENGTH);
- header->user_data_length = 0;
- }
-
- if (vdxGetUserData(inBuffer, header->user_data, &(header->user_data_length), bitErrorIndication) != VDX_OK)
- /* also bibError will be handled in exitAfterBitError */
- goto exitAfterBitError;
-
- } else if (sncCode != SNC_VID) {
-
- deb("vdxGetMPEGVolHeader: ERROR. No Start code after VO header\n");
- goto exitAfterBitError;
- }
- }
-
- /* if Video Object Start Code is present */
- bits = bibShowBits(MP4_VID_START_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits == MP4_VID_START_CODE) {
- /* video_object_start_code */
- bibFlushBits(MP4_VID_START_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- /* video_object_id */
- bits = bibGetBits(MP4_VID_ID_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->vo_id = (int) bits;
- }
-
- /* MVE */
- /* dummy indication of the position before VOL start code, only for recoginition of shortheader */
- if (!getInfo)
- {
- hTranscoder->ErrorResilienceInfo(NULL, inBuffer->getIndex, inBuffer->bitIndex);
- }
-
- /* vol_start_code */
- bits = bibShowBits(MP4_VOL_START_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if(bits != MP4_VOL_START_CODE)
- {
- /* If H.263 PSC, this is a short header stream, i.e. H.263 baseline */
- if ( (bits >> 6) == 32 ) {
- return VDX_OK;
- } else {
- deb("vdxGetMPEGVolHeader: ERROR - Bitstream does not start with MP4_VOL_START_CODE\n");
- goto exitAfterBitError;
- }
- }
-
- bibFlushBits(MP4_VOL_START_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- /* vol_id */
- bits = bibGetBits(MP4_VOL_ID_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->vol_id = (int) bits;
-
- /* random_accessible_vol (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->random_accessible_vol = (u_char) bits;
-
- /* video_object_type_indication (8 bits) */
- bits = bibGetBits(8, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits != 1) {
- /* this is not a simple video object stream */
- deb("vdxGetMPEGVolHeader: ERROR - This is not a simple video object stream\n");
- goto notSupported;
- }
-
- /* is_object_layer_identifier (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
- /* video_object_layer_verid (4 bits) */
- bits = bibGetBits(4, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits != 1) {
- /* this is not an MPEG-4 version 1 stream */
- deb("vdxGetMPEGVolHeader: ERROR - This is not an MPEG-4 version 1 stream\n");
- goto notSupported;
- }
-
- /* video_object_layer_priority (3 bits) */
- bits = bibGetBits(3, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->vo_priority = (int) bits;
- }
-
- /* aspect_ratio_info: `0010`- 12:11 (625-type for 4:3 picture) */
- bits = bibGetBits(4, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->pixel_aspect_ratio = (int) bits;
-
- /* extended par */
- if (bits == 15) {
- /* par_width */
- bits = bibGetBits(8, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- /* par_height */
- bits = bibGetBits(8, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- }
-
- /* vol_control_parameters flag */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
-
- /* chroma_format (2 bits) */
- bits = bibGetBits(2, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits != 1) {
- goto exitAfterBitError;
- }
-
- /* low_delay (1 bits) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- /* vbv_parameters (1 bits) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
-
- /* first_half_bitrate (15 bits) */
- bits = bibGetBits(15, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->bit_rate = (bits << 15);
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- /* latter_half_bitrate (15 bits) */
- bits = bibGetBits(15, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->bit_rate += bits;
- header->bit_rate *= 400;
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- /* first_half_vbv_buffer_size (15 bits) */
- bits = bibGetBits(15, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->vbv_buffer_size = (bits << 3);
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- /* latter_half_vbv_buffer_size (3 bits) */
- bits = bibGetBits(3, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->vbv_buffer_size += bits;
- header->vbv_buffer_size <<= 14 /**= 16384*/;
-
- /* first_half_vbv_occupancy (11 bits) */
- bits = bibGetBits(11, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->vbv_occupancy = (bits << 15);
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- /* latter_half_vbv_occupancy (15 bits) */
- bits = bibGetBits(15, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->vbv_occupancy += bits;
- header->vbv_occupancy <<= 6 /**= 64*/;
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- } else {
- fUseDefaultVBVParams = 1;
- }
- } else {
- fUseDefaultVBVParams = 1;
- }
-
- if (fUseDefaultVBVParams) {
-
- /* default values */
- header->vbv_buffer_size =
- ((header->profile_level == 0 || header->profile_level == 1) ? 5 : 20);
- header->vbv_occupancy = header->vbv_buffer_size*170;
- header->bit_rate =
- ((header->profile_level == 0 || header->profile_level == 1) ? 64 :
- ((header->profile_level == 2) ? 128 : 384));
-
- header->vbv_occupancy <<= 6 /**= 64*/;
- header->vbv_buffer_size <<= 14 /**= 16384*/;
- header->bit_rate <<= 10 /**= 1024*/;
- }
-
- /* vol_shape (2 bits) */
- bits = bibGetBits(2, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- /* rectangular_shape = '00' */
- if (bits != 0) {
- deb("vdxGetMPEGVolHeader: ERROR - Not rectangular shape is not supported\n");
- goto notSupported;
- }
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- /* MVE */
- if (!getInfo)
- {
- hTranscoder->MPEG4TimerResolution(inBuffer->getIndex, inBuffer->bitIndex);
- }
-
- /* time_increment_resolution */
- bits = bibGetBits(16, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->time_increment_resolution = (int) bits;
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- /* fixed_vop_rate */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- /* MVE */
- header->fixed_vop_rate = (u_char)bits;
-
- /* fixed_vop_time_increment (1-15 bits) */
- if (bits) {
- for (num_bits = 1; ((header->time_increment_resolution-1) >> num_bits) != 0; num_bits++)
- {
- }
-
- bits = bibGetBits(num_bits, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- }
-
- /* if rectangular_shape !always! */
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- /* vol_width (13 bits) */
- bits = bibGetBits(13, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->lumWidth = (int) bits;
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- /* vol_height (13 bits) */
- bits = bibGetBits(13, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->lumHeight = (int) bits;
-
- /* endif rectangular_shape */
-
- /* marker_bit */
- if (!bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError))
- goto exitAfterBitError;
-
- /* interlaced (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits)
- {
- deb("vdxGetMPEGVolHeader: ERROR - Interlaced VOP not supported\n");
- goto notSupported;
- }
-
- /* OBMC_disable */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (!bits) {
- deb("vdxGetMPEGVolHeader: ERROR - Overlapped motion compensation not supported\n");
- goto notSupported;
- }
-
- /* sprite_enable (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
- deb("vdxGetMPEGVolHeader: ERROR - Sprites not supported\n");
- goto notSupported;
- }
-
- /* not_8_bit (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
- deb("vdxGetMPEGVolHeader: ERROR - Not 8 bits/pixel not supported\n");
- goto notSupported;
- }
-
- /* quant_type (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
- deb("vdxGetMPEGVolHeader: ERROR - H.263/MPEG-2 Quant Table switch not supported\n");
- goto notSupported;
- }
-
- /* complexity_estimation_disable (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (!bits) {
- deb("vdxGetMPEGVolHeader: ERROR - Complexity estimation header not supported\n");
- goto notSupported;
- }
-
- /* MVE */
- if (!getInfo)
- {
- hTranscoder->ErrorResilienceInfo(NULL, inBuffer->getIndex, inBuffer->bitIndex);
- }
- else
- {
- *aByteIndex = inBuffer->getIndex;
- *aBitIndex = inBuffer->bitIndex;
- }
-
- /* resync_marker_disable (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->error_res_disable = (u_char) bits;
-
- /* data_partitioned (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->data_partitioned = (u_char) bits;
-
- if (header->data_partitioned) {
- /* reversible_vlc (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- header->reversible_vlc = (u_char) bits;
- }
-
- /* MVE */
- if (!getInfo)
- {
- hTranscoder->ErrorResilienceInfo(header, 0, 0);
- }
-
- /* scalability (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if (bits) {
- deb("vdxGetMPEGVolHeader: ERROR - Scalability not supported\n");
- goto notSupported;
- }
-
- /* check the next start code */
- sncCode = sncCheckMpegSync(inBuffer, 0, &bibError);
-
- /* Removed since the VOL header may be followed by another header (H.245 & MPEG-4 signaling)
- and sncCheckMpegSync does not recognize VOS start code
- if (sncCode == SNC_NO_SYNC || bibError)
- {
- deb("vdxGetMPEGVolHeader: ERROR. No Start code after VOL header\n");
- goto exitAfterBitError;
- }
- */
- /* If User data is available */
- if (sncCode == SNC_USERDATA && !bibError)
- {
- if (!header->user_data) {
- header->user_data = (char *) malloc(MAX_USER_DATA_LENGTH);
- header->user_data_length = 0;
- }
-
- if (vdxGetUserData(inBuffer, header->user_data, &(header->user_data_length), bitErrorIndication) != VDX_OK)
- /* also bibError will be handled in exitAfterBitError */
- goto exitAfterBitError;
- }
-
- /* If no error in bit buffer functions */
- if (!bibError)
- return VDX_OK;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-
- exitAfterBitError:
- if (bibError && bibError != ERR_BIB_NOT_ENOUGH_DATA)
- return VDX_ERR_BIB;
-
- return VDX_OK_BUT_BIT_ERROR;
-
- notSupported:
- return VDX_ERR_NOT_SUPPORTED;
-}
-
-/* {{-output"vdxGetGovHeader.txt"}} */
-/*
- *
- * vdxGetGovHeader
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * header output parameters: picture header
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function reads the GOV header from inBuffer.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- * VDX_ERR_NO_START_CODE if start code is not found
- * VDX_ERR_NOT_SUPPORTED if broken_link and closed_gov conflict
- *
- */
-
-int vdxGetGovHeader(
- bibBuffer_t *inBuffer,
- vdxGovHeader_t *header,
- int *bitErrorIndication)
-/* {{-output"vdxGetGovHeader.txt"}} */
-{
- int tmpvar;
- u_int32 bits;
- int time_s;
- int bitsGot, sncCode;
- int16 bibError = 0;
-
- vdxAssert(inBuffer != NULL);
- vdxAssert(header != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- memset(header, 0, sizeof(vdxGovHeader_t));
- *bitErrorIndication = 0;
-
- /* group_start_code (32 bits) */
- bits = bibGetBits(32, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- if ( bibError )
- goto exitAfterBitError;
- if( bits != MP4_GROUP_START_CODE )
- {
- deb0p("ERROR. Bitstream does not start with MP4_GROUP_START_CODE\n");
- goto exitAfterBitError;
- }
-
- /* time_code_hours (5 bits) */
- tmpvar = (int) bibGetBits(5, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- if ( bibError )
- goto exitAfterBitError;
-
- time_s= tmpvar*3600;
-
- /* time_code_minutes (6 bits) */
- tmpvar = (int) bibGetBits(6, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- if ( bibError )
- goto exitAfterBitError;
-
- time_s += tmpvar*60;
-
- /* marker_bit (1 bit) */
- tmpvar = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
- if ( !tmpvar )
- goto exitAfterBitError;
-
- /* time_code_seconds (6 bits) */
- tmpvar = (int) bibGetBits(6, inBuffer, &bitsGot, bitErrorIndication, &bibError);
-
- time_s += tmpvar;
-
- /* closed_gov (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- header->closed_gov= (u_char) bits;
-
- /* broken_link (1 bit) */
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- header->broken_link = (u_char) bits;
-
- if ( (header->closed_gov == 0)&&(header->broken_link == 1) )
- {
- deb0p("ERROR. GOVHeader: closed_gov = 0\tbroken_link = 1\n");
- goto exitAfterBitError;
- }
-
- /* Stuff the bits before the next start code */
- sncCode = sncCheckMpegSync(inBuffer, 1, &bibError);
- if ((sncCode == SNC_NO_SYNC) || bibError)
- {
- deb0p("ERROR. No VOP Start code after GOV header\n");
- /* also bibError will be handled in exitAfterBitError */
- goto exitAfterBitError;
- }
-
- /* If User data is available */
- if (sncCode == SNC_USERDATA)
- {
- if (!header->user_data) {
- header->user_data = (char *) malloc(MAX_USER_DATA_LENGTH);
- header->user_data_length = 0;
- }
-
- if (vdxGetUserData(inBuffer, header->user_data, &(header->user_data_length), bitErrorIndication) != VDX_OK)
- /* also bibError will be handled in exitAfterBitError */
- goto exitAfterBitError;
- }
-
- header->time_stamp = time_s;
-
- /* If no error in bit buffer functions */
- if (!bibError)
- return VDX_OK;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-
- exitAfterBitError:
- if (bibError && bibError != ERR_BIB_NOT_ENOUGH_DATA)
- return VDX_ERR_BIB;
-
- return VDX_OK_BUT_BIT_ERROR;
-
-}
-
-/* {{-output"vdxGetVopHeader.txt"}} */
-/*
- *
- * vdxGetVopHeader
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * inParam input parameters
- * header output parameters: picture header
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function reads the VOP header from inBuffer.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- * VDX_ERR_NO_START_CODE if start code is not found
- * VDX_ERR_NOT_SUPPORTED if broken_link and closed_gov conflict
- *
- *
- */
-
-int vdxGetVopHeader(
- bibBuffer_t *inBuffer,
- const vdxGetVopHeaderInputParam_t *inpParam,
- vdxVopHeader_t *header,
- int * ModuloByteIndex,
- int * ModuloBitIndex,
- int * ByteIndex,
- int * BitIndex,
- int *bitErrorIndication)
-/* {{-output"vdxGetVopHeader.txt"}} */
-{
-
- int tmpvar;
- u_int32 bits;
- int bitsGot;
- int time_base_incr = 0,
- num_bits;
- int16
- bibError = 0;
-
- vdxAssert(inBuffer != NULL);
- vdxAssert(header != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- memset(header, 0, sizeof(vdxVopHeader_t));
- *bitErrorIndication = 0;
-
- /* vop_start_code (32 bits) */
- bits = bibGetBits(MP4_VOP_START_CODE_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitFunction;
-
- if( bits != MP4_VOP_START_CODE )
- {
- deb0p("ERROR. Bitstream does not start with MP4_VOP_START_CODE\n");
- goto exitAfterBitError;
- }
-
- *bitErrorIndication = 0;
-
- /* vop_prediction_type (2 bits) */
- bits = bibGetBits(2, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- if ( (bits != VDX_VOP_TYPE_P && bits != VDX_VOP_TYPE_I) )
- {
- deb("ERROR. Not supported VOP prediction type\n");
- goto exitAfterBitError;
- }
-
- header->coding_type = (u_char) bits;
-
- /* MVE */
- *ModuloByteIndex = inBuffer->numBytesRead;
- *ModuloBitIndex = inBuffer->bitIndex;
-
- /* modulo_time_base (? bits) */
- tmpvar = (int) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- while( tmpvar == 1 && !bibError )
- {
- tmpvar = (int) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- time_base_incr++;
- }
- if ( bibError )
- goto exitAfterBitError;
-
- header->time_base_incr = time_base_incr;
-
- /* marker_bit (1 bit) */
- tmpvar = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
- if ( !tmpvar )
- goto exitAfterBitError;
-
- /* MVE */
- *ByteIndex = inBuffer->numBytesRead;
- *BitIndex = inBuffer->bitIndex;
-
- /* vop_time_increment (1-16 bits) */
- for (num_bits = 1; ((inpParam->time_increment_resolution-1) >> num_bits) != 0; num_bits++)
- {
- }
-
- tmpvar = (int) bibGetBits(num_bits, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- header->time_inc = tmpvar;
-
- /* marker_bit (1 bit) */
- tmpvar = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
- if ( !tmpvar )
- goto exitAfterBitError;
-
- /* vop_coded (1 bit) */
- header->vop_coded = (u_char) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- if ( !header->vop_coded ) {
- goto exitAfterBitError;
- }
-
- /* vop_rounding_type (1 bit) */
- if (header->coding_type == VDX_VOP_TYPE_P)
- {
- bits = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
- header->rounding_type = (int) bits;
- } else
- header->rounding_type = 0;
-
- /* intra_dc_vlc_thr (3 bits) */
- bits = bibGetBits(3, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- header->intra_dc_vlc_thr = (int) bits;
-
- /* vop_quant (5 bits) */
- bits = bibGetBits(5, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- header->quant = (int) bits;
-
- /* vop_fcode_forward (3 bits) */
- if (header->coding_type == VDX_VOP_TYPE_P)
- {
- bits = bibGetBits(3, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
- header->fcode_forward = (int) bits;
- } else {
- /* In case of an Intra Frame to calculate the length of the
- VP resynchronization marker later on fcode_forward should be
- assumed to have the value 1. */
- header->fcode_forward = 1;
- }
-
- exitFunction:
-
- /* If no error in bit buffer functions */
- if (!bibError)
- return VDX_OK;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-
- exitAfterBitError:
-
- if (bibError && bibError != ERR_BIB_NOT_ENOUGH_DATA)
- return VDX_ERR_BIB;
-
- return VDX_OK_BUT_BIT_ERROR;
-
-}
-
-/*
- * vdxGetUserData
- *
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * user_data string of user data read byte-by-byte from
- * the stream
- * user_data_length number of bytes of user data
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function reads a string of bytes as user data from the bitsream
- * It is called from te VOL header or GOV header
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- *
- */
-int vdxGetUserData(bibBuffer_t *inBuffer,
- char *user_data, int *user_data_length,
- int *bitErrorIndication)
-{
- int i;
- u_int32 bits;
- int bitsGot;
- int16 ownError=0;
-
- /* user_data_start_code (32 bits) */
- bits = bibGetBits(32, inBuffer, &bitsGot, bitErrorIndication, &ownError);
- if ( ownError )
- goto exitFunction;
-
- if (bits != MP4_USER_DATA_START_CODE)
- {
- deb0p("ERROR. Bitstream does not start with MP4_USER_DATA_START_CODE\n");
- goto exitFunction;
- }
-
- /* read until start_code 0x000001 */
- for ( i=(*user_data_length);
- (((bits = bibShowBits(24, inBuffer, &bitsGot, bitErrorIndication, &ownError)) != 0x000001)&&(ownError==0));
- i++ )
- {
- bits = bibGetBits(8, inBuffer, &bitsGot, bitErrorIndication, &ownError);
- if (ownError)
- goto exitFunction;
-
- if (i<MAX_USER_DATA_LENGTH)
- {
- user_data[i] = (u_char) bits;
- }
- else
- {
- break;
- }
- }
-
-
- *user_data_length = (i>=MAX_USER_DATA_LENGTH) ? MAX_USER_DATA_LENGTH : i++;
-
- exitFunction:
-
- /* If no error in bit buffer functions */
- if (!ownError)
- return VDX_OK;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (ownError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-
-}
-
-/*
- * Video Packet Layer Global Functions
- */
-
-/* {{-output"vdxGetVideoPacketHeader.txt"}} */
-/*
- *
- * vdxGetVideoPacketHeader
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * header output parameters: picture header
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function reads the Video Packet header from inBuffer.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- * VDX_ERR_NO_START_CODE if start code is not found
- * VDX_ERR_NOT_SUPPORTED if broken_link and closed_gov conflict
- *
- *
- */
-
-int vdxGetVideoPacketHeader(
- bibBuffer_t *inBuffer,
- const vdxGetVideoPacketHeaderInputParam_t *inpParam,
- vdxVideoPacketHeader_t *header,
- int *bitErrorIndication)
-/* {{-output"vdxGetVideoPacketHeader.txt"}} */
-{
- int tmpvar, num_bits, bitsGot;
- u_int32 bits;
- int MBNumLength,
- time_base_incr = 0;
- int16
- bibError = 0;
-
- vdxAssert(inBuffer != NULL);
- vdxAssert(header != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- memset(header, 0, sizeof(vdxVideoPacketHeader_t));
- *bitErrorIndication = 0;
-
- /* resync marker */
- tmpvar = bibGetBits(16 + inpParam->fcode_forward, inBuffer, &bitsGot,
- bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
- if ( (int) tmpvar != MP4_RESYNC_MARKER )
- {
- deb("ERROR. No Resync Marker found\n");
- goto exitAfterBitError;
- }
-
- /* Macroblock Number */
- for (MBNumLength = 1; ((inpParam->numOfMBs-1) >> MBNumLength) != 0; MBNumLength++)
- {
- }
-
- header->currMBNum = (int) bibGetBits(MBNumLength, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- /* quant_scale (5 bits) */
- bits = bibGetBits(5, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- header->quant = (int) bits;
-
- /* header_extension_code (1 bit) */
- header->fHEC = (u_char) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- if(header->fHEC) {
- /* modulo_time_base (? bits) */
- tmpvar = (int) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- while (tmpvar == 1 && !bibError)
- {
- tmpvar = (int) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- time_base_incr++;
- }
- if ( bibError )
- goto exitAfterBitError;
-
- header->time_base_incr = time_base_incr;
-
- /* marker_bit (1 bit) */
- tmpvar = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
- if ( !tmpvar )
- goto exitAfterBitError;
-
- /* vop_time_increment (1-15 bits) */
- for (num_bits = 1; ((inpParam->time_increment_resolution-1) >> num_bits) != 0; num_bits++)
- {
- }
-
- tmpvar = (int) bibGetBits(num_bits, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- header->time_inc = tmpvar;
-
- /* marker_bit (1 bit) */
- tmpvar = bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
- if (!tmpvar)
- goto exitAfterBitError;
-
- /* vop_prediction_type (2 bits) */
- bits = bibGetBits(2, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- if ((bits != VDX_VOP_TYPE_P && bits != VDX_VOP_TYPE_I))
- {
- deb("ERROR. Not supported VOP prediction type\n");
- goto exitAfterBitError;
- }
-
- header->coding_type = (u_char) bits;
-
- /* intra_dc_vlc_thr (3 bits) */
- bits = bibGetBits(3, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
-
- header->intra_dc_vlc_thr = (int) bits;
-
- /* vop_fcode_forward (3 bits) */
- if (header->coding_type == VDX_VOP_TYPE_P)
- {
- bits = bibGetBits(3, inBuffer, &bitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitAfterBitError;
- header->fcode_forward = (int) bits;
- } else
- header->fcode_forward = 1;
- }
-
- /* Check success and return */
-
- /* If no error in bit buffer functions */
- if (!bibError)
- return VDX_OK;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-
- exitAfterBitError:
- if (bibError && bibError != ERR_BIB_NOT_ENOUGH_DATA)
- return VDX_ERR_BIB;
-
- return VDX_OK_BUT_BIT_ERROR;
-}
-
-/*
- * Macroblock Layer Global Functions
- */
-
-/*
- *
- * vdxGetDataPartitionedIMBLayer_Part1
- *
- * Parameters:
- * inBuffer input buffer
- * inpParam input parameters
- * MBList a double-linked list for soring
- * MB parameters + DC values in the VP
- * bitErrorIndication
- * non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function gets the first (DC) partition of a data
- * partitioned encoded Video Packet in an Intra-VOP.
- * The parameters MCBPC, DQUANT and DC values of all the MBs
- * in the VP are read and stored in the linked list.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- * Error codes:
- * error codes returned by bibFlushBits/bibGetBits/bibShowBits
- *
- *
- */
-
-int vdxGetDataPartitionedIMBLayer_Part1(
- bibBuffer_t *inBuffer, bibBuffer_t *outBuffer, bibBufferEdit_t *bufEdit,
- int aColorEffect, int *aStartByteIndex, int *aStartBitIndex,
- CMPEG4Transcoder *hTranscoder,
- const vdxGetDataPartitionedIMBLayerInputParam_t *inpParam,
- dlst_t *MBList,
- int *bitErrorIndication)
-{
-
- int mcbpcIndex,
- retValue = VDX_OK,
- fDQUANT,
- new_quant, previous_quant,
- bitsGot,
- i,
- IntraDC_size,
- IntraDC_delta;
-
- /* MVE */
- int StartByteIndex;
- int StartBitIndex;
-
- int16 error=0;
- vdxIMBListItem_t *MBinstance = NULL;
-
-
- vdxAssert(inpParam != NULL);
- vdxAssert(inBuffer != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- previous_quant = inpParam->quant;
-
- /* MVE */
- int stuffingStartByteIndex, stuffingStartBitIndex, stuffingEndByteIndex, stuffingEndBitIndex;
- stuffingStartByteIndex = stuffingEndByteIndex = inBuffer->getIndex;
- stuffingStartBitIndex = stuffingEndBitIndex = inBuffer->bitIndex;
-
- while (bibShowBits(MP4_DC_MARKER_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &error) != MP4_DC_MARKER && !error)
- {
- /* MVE */
- StartByteIndex = inBuffer->getIndex;
- StartBitIndex = inBuffer->bitIndex;
-
- retValue = vdxGetMCBPCIntra(inBuffer, &mcbpcIndex, bitErrorIndication);
- if (retValue != VDX_OK)
- goto exitFunction;
-
- if (mcbpcIndex == 8)
- {
- /* MVE */
- stuffingEndByteIndex = inBuffer->getIndex;
- stuffingEndBitIndex = inBuffer->bitIndex;
-
- continue; /* skip stuffing */
- }
-
- /* Create new MBInstance for the next MB */
- MBinstance = (vdxIMBListItem_t *) malloc(sizeof(vdxIMBListItem_t));
- if (!MBinstance)
- {
- deb("ERROR - MBinstance creation failed\n");
- retValue = H263D_ERROR;
- goto exitFunction;
- }
- memset(MBinstance, 0, sizeof(vdxIMBListItem_t));
-
- /* CBPC (2 LSBs of MCBPC) */
- MBinstance->cbpc = mcbpcIndex & 3;
-
- /* MVE */
- MBinstance->mcbpc = mcbpcIndex;
- VDT_SET_START_POSITION(MBinstance,11,stuffingStartByteIndex,stuffingStartBitIndex); // 11: MB stuffing bits
- VDT_SET_END_POSITION(MBinstance,11,stuffingEndByteIndex,stuffingEndBitIndex); // 11: MB stuffing bits
-
- VDT_SET_START_POSITION(MBinstance,0,StartByteIndex,StartBitIndex); // 0: mcbpc
- VDT_SET_END_POSITION(MBinstance,0,inBuffer->getIndex,inBuffer->bitIndex); // 0: mcbpc
- VDT_SET_START_POSITION(MBinstance,1,inBuffer->getIndex,inBuffer->bitIndex); // 1: dquant
-
- /* DQUANT is given for MCBPC indexes 4..7 */
- fDQUANT = mcbpcIndex & 4;
-
- if (fDQUANT) {
- retValue = vdxUpdateQuant(inBuffer, 0, previous_quant,
- &new_quant, bitErrorIndication);
- if (retValue != VDX_OK)
- goto exitFunction;
- }
- /* Else no DQUANT */
- else
- new_quant = previous_quant;
-
- MBinstance->dquant = fDQUANT ? new_quant - previous_quant : 0;
- MBinstance->quant = previous_quant = new_quant;
-
- /* MVE */
- VDT_SET_END_POSITION(MBinstance,1,inBuffer->getIndex,inBuffer->bitIndex); // 1: dquant
- VDT_SET_START_POSITION(MBinstance,4,inBuffer->getIndex,inBuffer->bitIndex); // 4: intraDC
- VDT_SET_START_POSITION(MBinstance,5,inBuffer->getIndex,inBuffer->bitIndex); // 5: intraDC
- VDT_SET_START_POSITION(MBinstance,6,inBuffer->getIndex,inBuffer->bitIndex); // 6: intraDC
- VDT_SET_START_POSITION(MBinstance,7,inBuffer->getIndex,inBuffer->bitIndex); // 7: intraDC
- VDT_SET_START_POSITION(MBinstance,8,inBuffer->getIndex,inBuffer->bitIndex); // 8: intraDC
- VDT_SET_START_POSITION(MBinstance,9,inBuffer->getIndex,inBuffer->bitIndex); // 9: intraDC
-
- VDT_SET_END_POSITION(MBinstance,4,inBuffer->getIndex,inBuffer->bitIndex); // 4: intraDC
- VDT_SET_END_POSITION(MBinstance,5,inBuffer->getIndex,inBuffer->bitIndex); // 5: intraDC
- VDT_SET_END_POSITION(MBinstance,6,inBuffer->getIndex,inBuffer->bitIndex); // 6: intraDC
- VDT_SET_END_POSITION(MBinstance,7,inBuffer->getIndex,inBuffer->bitIndex); // 7: intraDC
- VDT_SET_END_POSITION(MBinstance,8,inBuffer->getIndex,inBuffer->bitIndex); // 8: intraDC
- VDT_SET_END_POSITION(MBinstance,9,inBuffer->getIndex,inBuffer->bitIndex); // 9: intraDC
-
- /* Color Toning */
- hTranscoder->AfterMBLayer(new_quant);
-
-
- MBinstance->switched = aicIntraDCSwitch(inpParam->intra_dc_vlc_thr,new_quant);
-
- /* Intra_DC_Coeffs */
- if(!MBinstance->switched) {
- for (i=0; i<6; i++) {
-
- /* MVE */
- VDT_SET_START_POSITION(MBinstance,i+4,inBuffer->getIndex,inBuffer->bitIndex); // 6: intraDC,chrominance
-
- retValue = vdxGetIntraDC(inBuffer, outBuffer, bufEdit, aColorEffect, aStartByteIndex, aStartBitIndex,
- i, &IntraDC_size, &IntraDC_delta, bitErrorIndication);
-
- /* MVE */
- VDT_SET_END_POSITION(MBinstance,i+4,inBuffer->getIndex,inBuffer->bitIndex); // 6: intraDC,chrominance
-
- if (retValue != VDX_OK)
- goto exitFunction;
-
- MBinstance->DC[i] = IntraDC_delta;
- }
- }
-
-
- /* Put MBinstance into the queue */
- dlstAddAfterCurr(MBList, MBinstance);
- MBinstance = NULL;
-
- /* MVE */
- // begin another MB, record the position of MB stuffing
- stuffingStartByteIndex = stuffingEndByteIndex = inBuffer->getIndex;
- stuffingStartBitIndex = stuffingEndBitIndex = inBuffer->bitIndex;
-
- }
-
-exitFunction:
-
- if (MBinstance)
- free(MBinstance);
-
-
- /* If no error in bit buffer functions */
- if (!error)
- return retValue;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (error == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-}
-
-/*
- *
- * vdxGetDataPartitionedIMBLayer_Part2
- *
- * Parameters:
- * inBuffer input buffer
- * MBList a double-linked list for soring
- * MB parameters + DC values in the VP
- * numMBsInVP number of MBs in this VP
- * bitErrorIndication
- * non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function gets the second (CBPY) partition of a data
- * partitioned encoded Video Packet in an Intra-VOP.
- * The parameters CBPY and ac_pred_flag of all the MBs
- * in the VP are read and stored in the linked list.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- * Error codes:
- * error codes returned by bibFlushBits/bibGetBits/bibShowBits
- *
- *
- *
- */
-
-int vdxGetDataPartitionedIMBLayer_Part2(
- bibBuffer_t *inBuffer, bibBuffer_t */*outBuffer*/, bibBufferEdit_t */*bufEdit*/,
- int /*aColorEffect*/, int */*aStartByteIndex*/, int */*aStartBitIndex*/,
- dlst_t *MBList,
- int numMBsInVP,
- int *bitErrorIndication)
-{
-
- int cbpyIndex,
- i,
- retValue = VDX_OK,
- bitsGot;
-
- int16 error=0;
- u_char code;
- vdxIMBListItem_t *MBinstance;
-
- vdxAssert(inBuffer != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- /* get the first MB of the list */
- dlstHead(MBList, (void **) &MBinstance);
-
- /* Get ac_pred_flag and cbpy of all MBs in VP */
- for (i = 0; i < numMBsInVP; i++)
- {
- if (!MBinstance)
- {
- retValue = H263D_ERROR;
- goto exitFunction;
- }
-
- /* MVE */
- VDT_SET_START_POSITION(MBinstance,3,inBuffer->getIndex,inBuffer->bitIndex); // 3: ac_pred_flag
-
- /* ac_pred_flag (1 bit) */
- code = (u_char) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &error);
- if (error)
- goto exitFunction;
-
- /* MVE */
- VDT_SET_END_POSITION(MBinstance,3,inBuffer->getIndex,inBuffer->bitIndex); // 3: ac_pred_flag
- VDT_SET_START_POSITION(MBinstance,2,inBuffer->getIndex,inBuffer->bitIndex); // 2: cbpy
-
- /* CBPY */
- retValue = vdxGetCBPY(inBuffer, &cbpyIndex, bitErrorIndication);
- if (retValue != VDX_OK)
- goto exitFunction;
-
- /* MVE */
- VDT_SET_END_POSITION(MBinstance,2,inBuffer->getIndex,inBuffer->bitIndex); // 2: cbpy
-
- /* add the information to the MB data item.
- If the Part1 of the VP was decoded without errors (all MBs were
- attached to the list), MBinstance should always have a valid value. */
- if (MBinstance != NULL) {
- MBinstance->ac_pred_flag = code;
- MBinstance->cbpy = cbpyIndex;
-
- dlstNext(MBList, (void **) &MBinstance);
- }
- }
-
-exitFunction:
-
-
- /* If no error in bit buffer functions */
- if (!error)
- return retValue;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (error == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-}
-
-/*
- *
- * vdxGetDataPartitionedPMBLayer_Part1
- *
- * Parameters:
- * inBuffer input buffer
- * inpParam input parameters
- * MBList a double-linked list for soring
- * MB parameters + DC values in the VP
- * bitErrorIndication
- * non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function gets the first (Motion) partition of a data
- * partitioned encoded Video Packet in an Inter-VOP.
- * The parameters COD, MCBPC and motion vectors of all the MBs
- * in the VP are read and stored in the linked list.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- * Error codes:
- * error codes returned by bibFlushBits/bibGetBits/bibShowBits
- *
- *
- *
- */
-
- int vdxGetDataPartitionedPMBLayer_Part1(
- bibBuffer_t *inBuffer,
- bibBuffer_t */*outBuffer*/, bibBufferEdit_t */*bufEdit*/,
- int /*aColorEffect*/, int */*aStartByteIndex*/, int */*aStartBitIndex*/,
- const vdxGetDataPartitionedPMBLayerInputParam_t *inpParam,
- dlst_t *MBList,
- int *bitErrorIndication)
- {
-
- static const int mbTypeToMBClass[6] =
- {VDX_MB_INTER, VDX_MB_INTER, VDX_MB_INTER,
- VDX_MB_INTRA, VDX_MB_INTRA, VDX_MB_INTER};
-
- int mvdx, mvdy,
- numMVs,
- mcbpcIndex,
- retValue = VDX_OK,
- bitsGot;
-
- int16 error=0;
- u_char code;
- vdxPMBListItem_t *MBinstance = NULL;
-
- /* MVE */
- int StartByteIndex = 0;
- int StartBitIndex = 0;
- int stuffingStartByteIndex, stuffingStartBitIndex, stuffingEndByteIndex, stuffingEndBitIndex;
-
- stuffingStartByteIndex = stuffingEndByteIndex = inBuffer->getIndex;
- stuffingStartBitIndex = stuffingEndBitIndex = inBuffer->bitIndex;
-
- vdxAssert(inpParam != NULL);
- vdxAssert(inBuffer != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- while (bibShowBits(MP4_MOTION_MARKER_COMB_LENGTH, inBuffer, &bitsGot, bitErrorIndication, &error)
- != MP4_MOTION_MARKER_COMB && !error)
- {
- /* COD */
- code = (u_char) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &error);
- if (error)
- goto exitFunction;
-
- if (code == 0)
- {
-
- /* MVE */
- StartByteIndex = inBuffer->getIndex;
- StartBitIndex = inBuffer->bitIndex;
-
- /* MCBPC */
- retValue = vdxGetMCBPCInter(
- inBuffer,
- 0, /* No PLUSPTYPE present in MPEG-4 */
- 1, /* Four motion vectors always possible in MPEG-4 */
- 0, /* Flag to indicate if this is the first MB of a picture.
- Since this value is used only for checking if
- indices 21 - 24 are allowed in H.263, we don't have
- to set this correctly. (Indices 21 - 24 are not allowed
- in MPEG-4 at all.) */
- &mcbpcIndex,
- bitErrorIndication);
-
- if (retValue != VDX_OK)
- goto exitFunction;
-
- if (mcbpcIndex == 20)
- {
- /* MVE */
- stuffingEndByteIndex = inBuffer->getIndex;
- stuffingEndBitIndex = inBuffer->bitIndex;
-
- continue; /* skip stuffing */
- }
-
- /* Indices > 20 not allowed */
- if (mcbpcIndex > 20) {
- deb0p("vdxGetDataPartitionedPMBLayer_Part1: ERROR - Illegal code.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
-
- }
-
- /* Create new MBInstance for the MB */
- MBinstance = (vdxPMBListItem_t *) malloc(sizeof(vdxPMBListItem_t));
- if (!MBinstance)
- {
- deb("ERROR - MBinstance creation failed\n");
- goto exitFunction;
- }
- memset(MBinstance, 0, sizeof(vdxPMBListItem_t));
-
- MBinstance->fCodedMB = (u_char) (code ^ 1);
-
- if (MBinstance->fCodedMB)
- {
- /* MCBPC */
- MBinstance->cbpc = mcbpcIndex;
-
- /* MCBPC --> MB type & included data elements */
- MBinstance->mbType = mcbpcIndex / 4;
- MBinstance->mbClass = mbTypeToMBClass[MBinstance->mbType];
-
- /* MVE */
- MBinstance->mcbpc = mcbpcIndex;
- VDT_SET_START_POSITION(MBinstance,11,stuffingStartByteIndex,stuffingStartBitIndex); // 11: MB stuffing bits
- VDT_SET_END_POSITION(MBinstance,11,stuffingEndByteIndex,stuffingEndBitIndex); // 11: MB stuffing bits
- VDT_SET_START_POSITION(MBinstance,0,StartByteIndex,StartBitIndex); // MCBPC
- VDT_SET_END_POSITION(MBinstance,0,inBuffer->getIndex,inBuffer->bitIndex);
-
- VDT_SET_START_POSITION(MBinstance,10,inBuffer->getIndex,inBuffer->bitIndex); // MVs
-
- /* MVD is included always for PB-frames and always if MB type is INTER */
- numMVs = MBinstance->numMVs =
- (MBinstance->mbClass == VDX_MB_INTER) ?
- ((MBinstance->mbType == 2 || MBinstance->mbType == 5) ? 4 : 1) : 0;
-
- if (numMVs) {
- int i;
- for (i = 0; i < numMVs; i++) {
- retValue = vdxGetScaledMVD(inBuffer,inpParam->f_code,&mvdx,bitErrorIndication);
- if (retValue != VDX_OK)
- goto exitFunction;
- retValue = vdxGetScaledMVD(inBuffer,inpParam->f_code,&mvdy,bitErrorIndication);
- if (retValue != VDX_OK)
- goto exitFunction;
-
- MBinstance->mvx[i] = mvdx;
- MBinstance->mvy[i] = mvdy;
- }
- }
-
- /* MVE */
- VDT_SET_END_POSITION(MBinstance,10,inBuffer->getIndex,inBuffer->bitIndex); // MVs
-
- }
-
- /* MVE */
- // begin another MB, record the position of MB stuffing
- stuffingStartByteIndex = stuffingEndByteIndex = inBuffer->getIndex;
- stuffingStartBitIndex = stuffingEndBitIndex = inBuffer->bitIndex;
-
- /* Put MBinstance into the queue */
- dlstAddAfterCurr(MBList, MBinstance);
- MBinstance = NULL;
- }
-
-exitFunction:
-
- if (MBinstance)
- free(MBinstance);
-
-
- /* If no error in bit buffer functions */
- if (!error)
- return retValue;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (error == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-
-}
-
-
-/*
- *
- * vdxGetDataPartitionedPMBLayer_Part2
- *
- * Parameters:
- * inBuffer input buffer
- * inpParam input parameters
- * MBList a double-linked list for soring
- * MB parameters + DC values in the VP
- * bitErrorIndication
- * non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function gets the second (CBPY) partition of a data
- * partitioned encoded Video Packet in an Inter-VOP.
- * The parameters CBPY, DQUANT and if Intra MB its DC coeffs
- * of all the MBs in the VP are read and stored in the linked list.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- * Error codes:
- * error codes returned by bibFlushBits/bibGetBits/bibShowBits
- *
- *
- *
- */
-
- int vdxGetDataPartitionedPMBLayer_Part2(
- bibBuffer_t *inBuffer,
- bibBuffer_t *outBuffer,
- bibBufferEdit_t *bufEdit,
- int aColorEffect, int *aStartByteIndex, int *aStartBitIndex,
- CMPEG4Transcoder *hTranscoder,
- const vdxGetDataPartitionedPMBLayerInputParam_t *inpParam,
- dlst_t *MBList,
- int *bitErrorIndication)
- {
-
- static const int mbTypeToDQUANTI[6] =
- {0, 1, 0, 0, 1, 1};
-
- int fDQUANT,
- cbpyIndex,
- retValue = VDX_OK,
- new_quant, previous_quant,
- bitsGot,
- i,
- IntraDC_size,
- IntraDC_delta;
-
- int16 error=0;
- u_char code;
- vdxPMBListItem_t *MBinstance;
-
- vdxAssert(inpParam != NULL);
- vdxAssert(inBuffer != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- previous_quant = inpParam->quant;
-
- /* Get ac_pred_flag and cbpy of all MBs in VP */
- for (dlstHead(MBList, (void **) &MBinstance);
- MBinstance != NULL;
- dlstNext(MBList, (void **) &MBinstance))
- {
-
- if (!MBinstance->fCodedMB) continue;
-
- /* MVE */
- VDT_SET_START_POSITION(MBinstance,3,inBuffer->getIndex,inBuffer->bitIndex); // 3 ac_pred_flag
-
- if (MBinstance->mbClass == VDX_MB_INTRA) {
-
- /* ac_pred_flag (1 bit) */
- code = (u_char) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &error);
- if (error)
- goto exitFunction;
-
- MBinstance->ac_pred_flag = code;
- }
-
- /* MVE */
- VDT_SET_END_POSITION(MBinstance,3,inBuffer->getIndex,inBuffer->bitIndex); // 3 ac_pred_flag
- VDT_SET_START_POSITION(MBinstance,2,inBuffer->getIndex,inBuffer->bitIndex); // 2: cbpy
-
- /* CBPY */
- retValue = vdxGetCBPY(inBuffer, &cbpyIndex, bitErrorIndication);
- if (retValue != VDX_OK)
- goto exitFunction;
-
- if (MBinstance->mbClass == VDX_MB_INTER)
- /* Convert index to INTER CBPY */
- cbpyIndex = 15 - cbpyIndex;
-
- MBinstance->cbpy = cbpyIndex;
-
- /* MVE */
- VDT_SET_END_POSITION(MBinstance,2,inBuffer->getIndex,inBuffer->bitIndex); //
- VDT_SET_START_POSITION(MBinstance,1,inBuffer->getIndex,inBuffer->bitIndex); // 1: dquant
-
- /* DQUANT is given for MCBPC indexes 4..7 */
- fDQUANT = mbTypeToDQUANTI[MBinstance->mbType];
-
- if (fDQUANT) {
- retValue = vdxUpdateQuant(inBuffer, 0, previous_quant,
- &new_quant, bitErrorIndication);
- if (retValue != VDX_OK)
- goto exitFunction;
- }
- /* Else no DQUANT */
- else
- new_quant = previous_quant;
-
- MBinstance->dquant = fDQUANT ? new_quant - previous_quant : 0;
- MBinstance->quant = previous_quant = new_quant;
-
- /* MVE */
- VDT_SET_END_POSITION(MBinstance,1,inBuffer->getIndex,inBuffer->bitIndex); // 1: dquant
- VDT_SET_START_POSITION(MBinstance,4,inBuffer->getIndex,inBuffer->bitIndex); // 4: intraDC
- VDT_SET_START_POSITION(MBinstance,5,inBuffer->getIndex,inBuffer->bitIndex); // 5: intraDC
- VDT_SET_START_POSITION(MBinstance,6,inBuffer->getIndex,inBuffer->bitIndex); // 6: intraDC
- VDT_SET_START_POSITION(MBinstance,7,inBuffer->getIndex,inBuffer->bitIndex); // 7: intraDC
- VDT_SET_START_POSITION(MBinstance,8,inBuffer->getIndex,inBuffer->bitIndex); // 8: intraDC
- VDT_SET_START_POSITION(MBinstance,9,inBuffer->getIndex,inBuffer->bitIndex); // 9: intraDC
-
- VDT_SET_END_POSITION(MBinstance,4,inBuffer->getIndex,inBuffer->bitIndex); // 4: intraDC
- VDT_SET_END_POSITION(MBinstance,5,inBuffer->getIndex,inBuffer->bitIndex); // 5: intraDC
- VDT_SET_END_POSITION(MBinstance,6,inBuffer->getIndex,inBuffer->bitIndex); // 6: intraDC
- VDT_SET_END_POSITION(MBinstance,7,inBuffer->getIndex,inBuffer->bitIndex); // 7: intraDC
- VDT_SET_END_POSITION(MBinstance,8,inBuffer->getIndex,inBuffer->bitIndex); // 8: intraDC
- VDT_SET_END_POSITION(MBinstance,9,inBuffer->getIndex,inBuffer->bitIndex); // 9: intraDC
-
- /* Color Toning */
- hTranscoder->AfterMBLayer(new_quant);
-
- if (MBinstance->mbClass == VDX_MB_INTRA) {
- MBinstance->switched = aicIntraDCSwitch(inpParam->intra_dc_vlc_thr,new_quant);
-
- /* Intra_DC_Coeffs */
- if(!MBinstance->switched) {
- for (i=0; i<6; i++) {
-
- /* MVE */
- VDT_SET_START_POSITION(MBinstance,i+4,inBuffer->getIndex,inBuffer->bitIndex); // 6: intraDC,chrominance
-
- retValue = vdxGetIntraDC(inBuffer, outBuffer, bufEdit, aColorEffect, aStartByteIndex, aStartBitIndex,
- i, &IntraDC_size, &IntraDC_delta, bitErrorIndication);
-
- /* MVE */
- VDT_SET_END_POSITION(MBinstance,i+4,inBuffer->getIndex,inBuffer->bitIndex); // 6: intraDC,chrominance
-
- if (retValue != VDX_OK)
- goto exitFunction;
- MBinstance->DC[i] = IntraDC_delta;
- }
- }
- }
- }
-
-exitFunction:
-
-
- /* If no error in bit buffer functions */
- if (!error)
- return retValue;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (error == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-
-}
-
-/*
- * Block Layer Global Functions
- */
-
-/* {{-output"vdxGetMPEGIntraDCTBlock.txt"}} */
-/*
- * vdxGetMPEGIntraDCTBlock
- *
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * startIndex the first index in block where to put data
- * block DCT coefficients of the block
- * in zigzag order
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function gets the DCT coefficients for one INTRA block.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- *
- *
- */
-
-int vdxGetMPEGIntraDCTBlock(
- bibBuffer_t *inBuffer,
- int startIndex,
- int *block,
- int *bitErrorIndication)
-/* {{-output"vdxGetMPEGIntraDCTBlock.txt"}} */
-{
- int
- numBitsGot,
- retValue = VDX_OK,
- tmpvar;
- int16
- bibError = 0;
-
- static const vdxVLCTable_t Intra_tcoefTab0[] = {
- {0x10401, 7}, {0x10301, 7}, {0x00601, 7}, {0x10501, 7},
- {0x00701, 7}, {0x00202, 7}, {0x00103, 7}, {0x00009, 7},
- {0x10002, 6}, {0x10002, 6}, {0x00501, 6}, {0x00501, 6},
- {0x10201, 6}, {0x10201, 6}, {0x10101, 6}, {0x10101, 6},
- {0x00401, 6}, {0x00401, 6}, {0x00301, 6}, {0x00301, 6},
- {0x00008, 6}, {0x00008, 6}, {0x00007, 6}, {0x00007, 6},
- {0x00102, 6}, {0x00102, 6}, {0x00006, 6}, {0x00006, 6},
- {0x00201, 5}, {0x00201, 5}, {0x00201, 5}, {0x00201, 5},
- {0x00005, 5}, {0x00005, 5}, {0x00005, 5}, {0x00005, 5},
- {0x00004, 5}, {0x00004, 5}, {0x00004, 5}, {0x00004, 5},
- {0x10001, 4}, {0x10001, 4}, {0x10001, 4}, {0x10001, 4},
- {0x10001, 4}, {0x10001, 4}, {0x10001, 4}, {0x10001, 4},
- {0x00001, 2}, {0x00001, 2}, {0x00001, 2}, {0x00001, 2},
- {0x00001, 2}, {0x00001, 2}, {0x00001, 2}, {0x00001, 2},
- {0x00001, 2}, {0x00001, 2}, {0x00001, 2}, {0x00001, 2},
- {0x00001, 2}, {0x00001, 2}, {0x00001, 2}, {0x00001, 2},
- {0x00001, 2}, {0x00001, 2}, {0x00001, 2}, {0x00001, 2},
- {0x00001, 2}, {0x00001, 2}, {0x00001, 2}, {0x00001, 2},
- {0x00001, 2}, {0x00001, 2}, {0x00001, 2}, {0x00001, 2},
- {0x00001, 2}, {0x00001, 2}, {0x00001, 2}, {0x00001, 2},
- {0x00002, 3}, {0x00002, 3}, {0x00002, 3}, {0x00002, 3},
- {0x00002, 3}, {0x00002, 3}, {0x00002, 3}, {0x00002, 3},
- {0x00002, 3}, {0x00002, 3}, {0x00002, 3}, {0x00002, 3},
- {0x00002, 3}, {0x00002, 3}, {0x00002, 3}, {0x00002, 3},
- {0x00101, 4}, {0x00101, 4}, {0x00101, 4}, {0x00101, 4},
- {0x00101, 4}, {0x00101, 4}, {0x00101, 4}, {0x00101, 4},
- {0x00003, 4}, {0x00003, 4}, {0x00003, 4}, {0x00003, 4},
- {0x00003, 4}, {0x00003, 4}, {0x00003, 4}, {0x00003, 4},
- };
-
-
- static const vdxVLCTable_t Intra_tcoefTab1[] = {
- {0x00012,10}, {0x00011,10}, {0x10e01, 9}, {0x10e01, 9},
- {0x10d01, 9}, {0x10d01, 9}, {0x10c01, 9}, {0x10c01, 9},
- {0x10b01, 9}, {0x10b01, 9}, {0x10a01, 9}, {0x10a01, 9},
- {0x10102, 9}, {0x10102, 9}, {0x10004, 9}, {0x10004, 9},
- {0x00c01, 9}, {0x00c01, 9}, {0x00b01, 9}, {0x00b01, 9},
- {0x00702, 9}, {0x00702, 9}, {0x00602, 9}, {0x00602, 9},
- {0x00502, 9}, {0x00502, 9}, {0x00303, 9}, {0x00303, 9},
- {0x00203, 9}, {0x00203, 9}, {0x00106, 9}, {0x00106, 9},
- {0x00105, 9}, {0x00105, 9}, {0x00010, 9}, {0x00010, 9},
- {0x00402, 9}, {0x00402, 9}, {0x0000f, 9}, {0x0000f, 9},
- {0x0000e, 9}, {0x0000e, 9}, {0x0000d, 9}, {0x0000d, 9},
- {0x10801, 8}, {0x10801, 8}, {0x10801, 8}, {0x10801, 8},
- {0x10701, 8}, {0x10701, 8}, {0x10701, 8}, {0x10701, 8},
- {0x10601, 8}, {0x10601, 8}, {0x10601, 8}, {0x10601, 8},
- {0x10003, 8}, {0x10003, 8}, {0x10003, 8}, {0x10003, 8},
- {0x00a01, 8}, {0x00a01, 8}, {0x00a01, 8}, {0x00a01, 8},
- {0x00901, 8}, {0x00901, 8}, {0x00901, 8}, {0x00901, 8},
- {0x00801, 8}, {0x00801, 8}, {0x00801, 8}, {0x00801, 8},
- {0x10901, 8}, {0x10901, 8}, {0x10901, 8}, {0x10901, 8},
- {0x00302, 8}, {0x00302, 8}, {0x00302, 8}, {0x00302, 8},
- {0x00104, 8}, {0x00104, 8}, {0x00104, 8}, {0x00104, 8},
- {0x0000c, 8}, {0x0000c, 8}, {0x0000c, 8}, {0x0000c, 8},
- {0x0000b, 8}, {0x0000b, 8}, {0x0000b, 8}, {0x0000b, 8},
- {0x0000a, 8}, {0x0000a, 8}, {0x0000a, 8}, {0x0000a, 8},
- };
-
- static const vdxVLCTable_t Intra_tcoefTab2[] = {
- {0x10007,11}, {0x10007,11}, {0x10006,11}, {0x10006,11},
- {0x00016,11}, {0x00016,11}, {0x00015,11}, {0x00015,11},
- {0x10202,10}, {0x10202,10}, {0x10202,10}, {0x10202,10},
- {0x10103,10}, {0x10103,10}, {0x10103,10}, {0x10103,10},
- {0x10005,10}, {0x10005,10}, {0x10005,10}, {0x10005,10},
- {0x00d01,10}, {0x00d01,10}, {0x00d01,10}, {0x00d01,10},
- {0x00503,10}, {0x00503,10}, {0x00503,10}, {0x00503,10},
- {0x00802,10}, {0x00802,10}, {0x00802,10}, {0x00802,10},
- {0x00403,10}, {0x00403,10}, {0x00403,10}, {0x00403,10},
- {0x00304,10}, {0x00304,10}, {0x00304,10}, {0x00304,10},
- {0x00204,10}, {0x00204,10}, {0x00204,10}, {0x00204,10},
- {0x00107,10}, {0x00107,10}, {0x00107,10}, {0x00107,10},
- {0x00014,10}, {0x00014,10}, {0x00014,10}, {0x00014,10},
- {0x00013,10}, {0x00013,10}, {0x00013,10}, {0x00013,10},
- {0x00017,11}, {0x00017,11}, {0x00018,11}, {0x00018,11},
- {0x00108,11}, {0x00108,11}, {0x00902,11}, {0x00902,11},
- {0x10302,11}, {0x10302,11}, {0x10402,11}, {0x10402,11},
- {0x10f01,11}, {0x10f01,11}, {0x11001,11}, {0x11001,11},
- {0x00019,12}, {0x0001a,12}, {0x0001b,12}, {0x00109,12},
- {0x00603,12}, {0x0010a,12}, {0x00205,12}, {0x00703,12},
- {0x00e01,12}, {0x10008,12}, {0x10502,12}, {0x10602,12},
- {0x11101,12}, {0x11201,12}, {0x11301,12}, {0x11401,12},
- {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7},
- {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7},
- {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7},
- {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7},
- {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7},
- {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7},
- {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7},
- {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7}, {0x01bff, 7},
- };
-
- static const int intra_max_level[2][64] = {
- {27, 10, 5, 4, 3, 3, 3, 3,
- 2, 2, 1, 1, 1, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- },
-
- {8, 3, 2, 2, 2, 2, 2, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0
- }
- };
-
- static const int intra_max_run0[28] = { 999, 14, 9, 7, 3, 2, 1,
- 1, 1, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
- };
-
- static const int intra_max_run1[9] = { 999, 20, 6,
- 1, 0, 0,
- 0, 0, 0
- };
-
- int
- code, /* bits got from bit buffer */
- index, /* index to zigzag table running from 1 to 63 */
- run, /* RUN code */
- level; /* LEVEL code */
-
- u_int32
- last, /* LAST code (see standard) */
- sign; /* sign for level */
-
- vdxVLCTable_t const *tab; /* pointer to lookup table */
-
- vdxAssert(inBuffer != NULL);
- vdxAssert(startIndex == 0 || startIndex == 1);
- vdxAssert(block != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- index = startIndex;
-
- do {
- code = (int) bibShowBits(12, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- deb("vdxGetDCTBlock: bibShowBits returned not enough data --> "
- "try to use the data available.\n");
- code <<= 12 - numBitsGot;
- bibError = 0;
- }
- else if (bibError ) {
- goto exitFunction;
- }
-
- /* Select the right table and index for the codeword */
- if (code >= 512)
- tab = &Intra_tcoefTab0[(code >> 5) - 16];
- else if (code >= 128)
- tab = &Intra_tcoefTab1[(code >> 2) - 32];
- else if (code >= 8)
- tab = &Intra_tcoefTab2[code - 8];
- else {
- deb("ERROR - illegal TCOEF\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- /* Flush the codeword from the buffer */
- bibFlushBits(tab->len, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if (bibError)
- goto exitFunction;
-
- /* the following is modified for 3-mode escape */
- if (tab->val == 7167) /* ESCAPE */
- {
-
- int run_offset=0,
- level_offset=0;
-
- code = (int) bibShowBits(2, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if (bibError) {
- goto exitFunction;
- }
-
- if (code<=2) {
-
- /* escape modes: level or run is offset */
- if (code==2) run_offset=1;
- else level_offset=1;
-
- /* Flush the escape code from the buffer */
- if (run_offset)
- bibFlushBits(2, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- else
- bibFlushBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
-
- if (bibError)
- goto exitFunction;
- /* Read next codeword */
- code = (int) bibShowBits(12, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- deb("vdxGetDCTBlock: bibShowBits returned not enough data --> "
- "try to use the data available.\n");
- code <<= 12 - numBitsGot;
- bibError = 0;
- }
- else if (bibError) {
- goto exitFunction;
- }
-
- /* Select the right table and index for the codeword */
- if (code >= 512)
- tab = &Intra_tcoefTab0[(code >> 5) - 16];
- else if (code >= 128)
- tab = &Intra_tcoefTab1[(code >> 2) - 32];
- else if (code >= 8)
- tab = &Intra_tcoefTab2[code - 8];
- else {
- deb("ERROR - illegal TCOEF\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- bibFlushBits(tab->len, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if (bibError)
- goto exitFunction;
-
- run = (tab->val >> 8) & 255;
- level = tab->val & 255;
- last = (tab->val >> 16) & 1;
-
- /* need to add back the max level */
- if (level_offset)
- level = level + intra_max_level[last][run];
- else if (last)
- run = run + intra_max_run1[level]+1;
- else
- run = run + intra_max_run0[level]+1;
-
- sign = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
-
- if ( bibError )
- goto exitFunction;
-
- if (sign)
- level = -level;
-
- } else {
-
- /* Flush the codeword from the buffer */
- bibFlushBits(2, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if (bibError)
- goto exitFunction;
-
- /* LAST */
- last = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if ( bibError )
- goto exitFunction;
- /* RUN */
- run = (int) bibGetBits(6, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if ( bibError )
- goto exitFunction;
- /* MARKER BIT */
- tmpvar = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,&bibError);
- if ( bibError )
- goto exitFunction;
- if (!tmpvar) {
-
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
- /* LEVEL */
- level = (int) bibGetBits(12, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if ( bibError )
- goto exitFunction;
- /* MARKER BIT */
- tmpvar = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,&bibError);
- if ( bibError )
- goto exitFunction;
- if(!tmpvar) {
-
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- /* 0000 0000 0000 and 1000 0000 0000 is forbidden unless in MQ mode */
- if (level == 0 || level == 2048) {
- deb("ERROR - illegal level.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- /* Codes 1000 0000 0001 .. 1111 1111 1111 */
- if (level > 2048)
- level -= 4096;
-
- } /* flc */
- }
- else {
-
- run = (tab->val >> 8) & 255;
- level = tab->val & 255;
- last = (tab->val >> 16) & 1;
-
- sign = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if ( bibError )
- goto exitFunction;
-
- if (sign)
- level = -level;
- }
-
- /* If too many coefficients */
- if (index + run > 63) {
- deb("ERROR - too many TCOEFs.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- /* Do run-length decoding */
- while (run--)
- block[index++] = 0;
-
- block[index++] = level;
-
- } while (!last);
-
- exitFunction:
-
- /* Set the rest of the coefficients to zero */
- while (index <= 63) {
- block[index++] = 0;
- }
-
- if (!bibError)
- return retValue;
-
- else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- else
- return VDX_ERR_BIB;
-}
-
-/*
- * Macroblock Layer Local Functions
- */
-
-/*
- *
- * vdxGetScaledMVD
- *
- *
- * Parameters:
- * inBuffer input buffer
- * f_code f_code for current Vop
- * error error code
- * *mvd10 returned MV value (10x)
- * *bitErrorIndication
- *
- * Function:
- * Calculates a component of a block (or MB) vector by decoding
- * the magnitude & residual of the diff. vector, making the prediction,
- * and combining the decoded diff. and the predicted values
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- *
- */
-
-
-int vdxGetScaledMVD(bibBuffer_t *inBuffer, int f_code,
- int *mvd10, int *bitErrorIndication)
-{
-
- int residual=0, vlc_code_mag=0;
- int diff_vector,
- retValue = VDX_OK,
- numBitsGot;
- int16 bibError = 0;
-
- /* decode component */
- retValue = vdxGetMVD(inBuffer,&vlc_code_mag,bitErrorIndication);
- if (retValue < 0)
- goto exitFunction;
-
- if ((f_code > 1) && (vlc_code_mag != 0))
- {
- vlc_code_mag /= 5;
-
- residual = (int)
- bibGetBits(f_code-1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if (bibError)
- goto exitFunction;
-
- diff_vector = ((abs(vlc_code_mag)-1)<<(f_code-1)) + residual + 1;
- if (vlc_code_mag < 0)
- diff_vector = -diff_vector;
-
- *mvd10 = diff_vector * 5;
- } else
- *mvd10 = vlc_code_mag;
-
- exitFunction:
-
- if (bibError) {
- if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
- return VDX_ERR_BIB;
- }
-
- return retValue;
-}
-
-/*
- * vdxGetIntraDC
- *
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * compnum number of the block component in the
- * 4:2:2 YUV scheme
- * (0..3) luma, (4..5) chroma
- * IntraDCDelta the read Intra DC value (quantized)
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function gets the Intra DC value
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- *
- *
- */
-
-int vdxGetIntraDC(bibBuffer_t *inBuffer, bibBuffer_t */*outBuffer*/, bibBufferEdit_t */*bufEdit*/, int /*aColorEffect*/,
- int */*aStartByteIndex*/, int */*aStartBitIndex*/, int compnum, int *IntraDC_size, int *IntraDCDelta,
- int *bitErrorIndication)
-{
- u_int32 code;
- int16 bibError=0;
- int first_bit,
- numBitsGot,
- retValue,
- IntraDCSize=0,
- tmpvar;
-
- vdxAssert(inBuffer != NULL);
- vdxAssert(IntraDCDelta != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- /* read DC size 2 - 8 bits */
- retValue = vdxGetIntraDCSize(inBuffer, compnum, &IntraDCSize, bitErrorIndication);
- if (retValue != VDX_OK)
- return retValue;
-
- *IntraDC_size = IntraDCSize;
- if (IntraDCSize == 0) {
-
- *IntraDCDelta = 0;
-
- } else {
-
- /* read delta DC 0 - 8 bits */
- code = bibGetBits(IntraDCSize,inBuffer,&numBitsGot,bitErrorIndication, &bibError);
-
- if (bibError) {
- if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
- return VDX_ERR_BIB;
- }
-
- first_bit = code >> (IntraDCSize-1);
-
- if (first_bit == 0 )
- { /* negative delta INTRA DC */
- *IntraDCDelta = -1 * (int) (code ^ ((1 << IntraDCSize)-1));
- }
- else
- { /* positive delta INTRA DC */
- *IntraDCDelta = (int) code;
- }
-
- if (IntraDCSize > 8) {
- /* Marker Bit */
- tmpvar = bibGetBits(1,inBuffer,&numBitsGot,bitErrorIndication, &bibError);
- if( !tmpvar ) {
- return VDX_OK_BUT_BIT_ERROR;
- }
- }
- }
-
- return VDX_OK;
-}
-
-/*
- * vdxGetIntraDCSize
- *
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * compnum number of the block component in the
- * 4:2:2 YUV scheme
- * (0..3) luma, (4..5) chroma
- * IntraDCSize Size of the following Intra DC FLC
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function gets the IntraDCSize VLC for luma or chroma
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- *
- *
- */
-
-static int vdxGetIntraDCSize(bibBuffer_t *inBuffer, int compnum, int *IntraDCSize,
- int *bitErrorIndication)
-{
- u_int32 code;
- int numBitsGot,
- retValue = VDX_OK;
- int16
- bibError = 0;
-
- if( compnum >=0 && compnum < 4 ) /* luminance block */
- {
- code = bibShowBits(11, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if (bibError && (bibError != ERR_BIB_NOT_ENOUGH_DATA)) {
- return VDX_ERR_BIB;
- }
-
- if ((bibError == ERR_BIB_NOT_ENOUGH_DATA) && (numBitsGot != 0)) {
- code <<= (11-numBitsGot);
- bibError = 0;
- }
-
- if ( code == 1)
- {
- *IntraDCSize = 12;
- bibFlushBits(11, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
-
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 11;
- bibFlushBits(10, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
-
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 10;
- bibFlushBits(9, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
-
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 9;
- bibFlushBits(8, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
-
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 8;
- bibFlushBits(7, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 7;
- bibFlushBits(6, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 6;
- bibFlushBits(5, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 5;
- bibFlushBits(4, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 4;
- bibFlushBits(3, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- } else if (code == 2) {
- *IntraDCSize = 3;
- bibFlushBits(3, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- } else if (code ==3) {
- *IntraDCSize = 0;
- bibFlushBits(3, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 2)
- {
- *IntraDCSize = 2;
- bibFlushBits(2, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- } else if (code == 3) {
- *IntraDCSize = 1;
- bibFlushBits(2, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
-
- }
- else /* chrominance block */
- {
- code = bibShowBits(12, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if (bibError && (bibError != ERR_BIB_NOT_ENOUGH_DATA)) {
- return VDX_ERR_BIB;
- }
-
- if ((bibError == ERR_BIB_NOT_ENOUGH_DATA) && (numBitsGot != 0)) {
- code <<= (12-numBitsGot);
- bibError = 0;
- }
-
- if ( code == 1)
- {
- *IntraDCSize = 12;
- bibFlushBits(12, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
-
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 11;
- bibFlushBits(11, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
-
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 10;
- bibFlushBits(10, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
-
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 9;
- bibFlushBits(9, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
-
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 8;
- bibFlushBits(8, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 7;
- bibFlushBits(7, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 6;
- bibFlushBits(6, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 5;
- bibFlushBits(5, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 4;
- bibFlushBits(4, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- if ( code == 1)
- {
- *IntraDCSize = 3;
- bibFlushBits(3, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- code >>= 1;
- {
- *IntraDCSize = 3-code;
- bibFlushBits(2, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- goto exitFunction;
- }
- }
-
-exitFunction:
-
- /* If no error in bit buffer functions */
- if (!bibError)
- return retValue;
-
- /* Else if ran out of data (i.e. decoding out of sync) */
- else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- /* Else other error in bit buffer functions */
- else
- return VDX_ERR_BIB;
-}
-
-/*
- * vdxGetRVLCIndex
- *
- *
- * Parameters:
- * bits input: the bits read from the stream
- * index output: the RVLC table index corresponding
- * to "bits"
- * length output: length of the codeword
- * intra_luma indicates an intra "1" or inter "0" Block
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function finds the RVLC table index (LAST,RUN.LEVEL) and length
- * of the code belonging to the input codeword.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR no such codeword exists in the table
- *
- *
- */
-
-int vdxGetRVLCIndex(
- u_int32 bits,
- u_int32 *index,
- int *length,
- int intra_luma,
- int *bitErrorIndication)
-{
-
- /* The indexes in the RVLC tables are written in equal RUN groups with
- LEVEL increasing */
-
- /* Intra RVLC table */
- static const vdxVLCTable_t RvlcTcoefTab0[] = {
- /* [0] --> e.g.: RUN = 0; LEVEL = 1..27 */
- {1,3}, {2,3}, {3,4}, {4,5}, {5,6}, {6,6}, {7,7}, {8,8},
- {9,8}, {10,9}, {11,9}, {12,10}, {13,10}, {14,10}, {15,11}, {16,11},
- {17,11}, {18,12}, {19,12}, {20,13}, {21,13}, {22,12}, {23,13}, {24,14},
- {25,14}, {26,14}, {27,15},
- /* [27] */
- {257,4}, {258,5}, {259,7}, {260,8}, {261,8}, {262,9},{263,10},{264,11},
- {265,11},{266,12},{267,13},{268,14},{269,14},
- /* [40] */
- {513,5}, {514,7}, {515,9},{516,10},{517,11},{518,11},{519,13},{520,13},
- {521,13},{522,14},{523,14},
- /* [51] */
- {769,5}, {770,8}, {771,9},{772,11},{773,12},{774,13},{775,14},{776,14},
- {777,15},
- /* [60] */
- {1025,6},{1026,8},{1027,10},{1028,12},{1029,12},{1030,14},
- /* [66] */
- {1281,6},{1282,9},{1283,11},{1284,12},{1285,14},{1286,14},
- /* [72] */
- {1537,7},{1538,10},{1539,11},{1540,12},{1541,15},
- /* [77] */
- {1793,7},{1794,10},{1795,11},{1796,13},{1797,15},
- /* [82] */
- {2049,8},{2050,10},{2051,13},{2052,14},
- /* [86] */
- {2305,8},{2306,11},{2307,13},{2308,15},
- /* [90] */
- {2561,9},{2562,12},
- /* [92] */
- {2817,10},{2818,13},
- /* [94] */
- {3073,10},{3074,15},
- /* [96] */
- {3329,11},
- {3585,13},
- {3841,13},
- {4097,14},
- {4353,14},
- {4609,14},
- {4865,15},
-
- /* [103] --> LAST = 1 */
- {65537,4},{65538,8},{65539,11},{65540,13},{65541,14},
- /* [108] */
- {65793,5},{65794,9},{65795,12},{65796,14},{65797,15},
- /* [113] */
- {66049,5},{66050,11},{66051,15},
- /* [116] */
- {66305,6},{66306,12},
- /* [118] */
- {66561,6},{66562,12},
- /* [120] */
- {66817,6},{66818,13},
- /* [122] */
- {67073,6},{67074,13},
- /* [124] */
- {67329,7},{67330,13},
- /* [126] */
- {67585,7},{67586,13},
- /* [128] */
- {67841,7},{67842,13},
- /* [130] */
- {68097,7},{68098,14},
- /* [132] */
- {68353,7},{68354,14},
- /* [134] */
- {68609,8},{68610,14},
- /* [136] */
- {68865,8},{68866,15},
- /* [138] */
- {69121,8},
- {69377,9},
- {69633,9},
- {69889,9},
- {70145,9},
- {70401,9},
- {70657,9},
- {70913,10},
- {71169,10},
- {71425,10},
- {71681,10},
- {71937,10},
- {72193,11},
- {72449,11},
- {72705,11},
- {72961,12},
- {73217,12},
- {73473,12},
- {73729,12},
- {73985,12},
- {74241,12},
- {74497,12},
- {74753,13},
- {75009,13},
- {75265,14},
- {75521,14},
- {75777,14},
- {76033,15},
- {76289,15},
- {76545,15},
- {76801,15},
-
- /* [169] */
- {7167,4} /* last entry: escape code */
-
-};
-
- /* Inter RVLC table */
- static const vdxVLCTable_t RvlcTcoefTab1[] = {
- /* [0] */
- {1,3}, {2,4}, {3,5}, {4,7}, {5,8}, {6,8}, {7,9}, {8,10},
- {9,10}, {10,11}, {11,11}, {12,12}, {13,13}, {14,13}, {15,13}, {16,13},
- {17,14}, {18,14}, {19,15},
- /* [19] */
- {257,3}, {258,6}, {259,8}, {260,9},{261,10},{262,11},{263,12},{264,13},
- {265,14},{266,14},
- /* [29] */
- {513,4}, {514,7}, {515,9},{516,11},{517,12},{518,14},{519,14},
- /* [36] */
- {769,5}, {770,8},{771,10},{772,12},{773,13},{774,14},{775,15},
- /* [43] */
- {1025,5},{1026,8},{1027,11},{1028,13},{1029,15},
- /* [48] */
- {1281,5},{1282,9},{1283,11},{1284,13},
- /* [52] */
- {1537,6},{1538,10},{1539,12},{1540,14},
- /* [56] */
- {1793,6},{1794,10},{1795,12},{1796,15},
- /* [60] */
- {2049,6},{2050,10},{2051,13},
- /* [63] */
- {2305,7},{2306,10},{2307,14},
- /* [66] */
- {2561,7},{2562,11},
- /* [68] */
- {2817,7},{2818,12},
- /* [70] */
- {3073,8},{3074,13},
- /* [72] */
- {3329,8},{3330,14},
- /* [74] */
- {3585,8},{3586,14},
- /* [76] */
- {3841,9},{3842,14},
- /* [78] */
- {4097,9},{4098,14},
- /* [80] */
- {4353,9},{4354,15},
- /* [82] */
- {4609,10},
- {4865,10},
- {5121,10},
- {5377,11},
- {5633,11},
- {5889,11},
- {6145,11},
- {6401,11},
- {6657,11},
- {6913,12},
- {7169,12},
- {7425,12},
- {7681,13},
- {7937,13},
- {8193,13},
- {8449,13},
- {8705,14},
- {8961,14},
- {9217,14},
- {9473,15},
- {9729,15},
-
- /* [103] --> LAST = 1 */
- {65537,4},{65538,8},{65539,11},{65540,13},{65541,14},
- /* [108] */
- {65793,5},{65794,9},{65795,12},{65796,14},{65797,15},
- /* [113] */
- {66049,5},{66050,11},{66051,15},
- /* [116] */
- {66305,6},{66306,12},
- /* [118] */
- {66561,6},{66562,12},
- /* [120] */
- {66817,6},{66818,13},
- /* [122] */
- {67073,6},{67074,13},
- /* [124] */
- {67329,7},{67330,13},
- /* [126] */
- {67585,7},{67586,13},
- /* [128] */
- {67841,7},{67842,13},
- /* [130] */
- {68097,7},{68098,14},
- /* [132] */
- {68353,7},{68354,14},
- /* [134] */
- {68609,8},{68610,14},
- /* [136] */
- {68865,8},{68866,15},
- /* [138] */
- {69121,8},
- {69377,9},
- {69633,9},
- {69889,9},
- {70145,9},
- {70401,9},
- {70657,9},
- {70913,10},
- {71169,10},
- {71425,10},
- {71681,10},
- {71937,10},
- {72193,11},
- {72449,11},
- {72705,11},
- {72961,12},
- {73217,12},
- {73473,12},
- {73729,12},
- {73985,12},
- {74241,12},
- {74497,12},
- {74753,13},
- {75009,13},
- {75265,14},
- {75521,14},
- {75777,14},
- {76033,15},
- {76289,15},
- {76545,15},
- {76801,15},
-
- /* [169] */
- {7167,4} /* last entry: escape code */
-};
-
- vdxVLCTable_t const *tab; /* pointer to lookup table */
-
- vdxAssert(bitErrorIndication != NULL);
-
- switch(bits) {
-
- case 0x0:
- if (intra_luma)
- tab = &RvlcTcoefTab0[169];
- else
- tab = &RvlcTcoefTab1[169];
- break;
-
- case 0x1:
- if (intra_luma)
- tab = &RvlcTcoefTab0[27];
- else
- tab = &RvlcTcoefTab1[1];
- break;
-
- case 0x4:
- if (intra_luma)
- tab = &RvlcTcoefTab0[40];
- else
- tab = &RvlcTcoefTab1[2];
- break;
-
- case 0x5:
- if (intra_luma)
- tab = &RvlcTcoefTab0[51];
- else
- tab = &RvlcTcoefTab1[36];
- break;
-
- case 0x6:
- if (intra_luma)
- tab = &RvlcTcoefTab0[0];
- else
- tab = &RvlcTcoefTab1[0];
- break;
-
- case 0x7:
- if (intra_luma)
- tab = &RvlcTcoefTab0[1];
- else
- tab = &RvlcTcoefTab1[19];
- break;
-
- case 0x8:
- if (intra_luma)
- tab = &RvlcTcoefTab0[28];
- else
- tab = &RvlcTcoefTab1[43];
- break;
-
- case 0x9:
- if (intra_luma)
- tab = &RvlcTcoefTab0[3];
- else
- tab = &RvlcTcoefTab1[48];
- break;
-
- case 0xa:
- if (intra_luma)
- tab = &RvlcTcoefTab0[2];
- else
- tab = &RvlcTcoefTab1[29];
- break;
-
- case 0xb:
- if (intra_luma)
- tab = &RvlcTcoefTab0[103];
- else
- tab = &RvlcTcoefTab1[103];
- break;
-
- case 0xc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[60];
- else
- tab = &RvlcTcoefTab1[20];
- break;
-
- case 0xd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[66];
- else
- tab = &RvlcTcoefTab1[52];
- break;
-
- case 0x12:
- if (intra_luma)
- tab = &RvlcTcoefTab0[108];
- else
- tab = &RvlcTcoefTab1[108];
- break;
-
- case 0x13:
- if (intra_luma)
- tab = &RvlcTcoefTab0[113];
- else
- tab = &RvlcTcoefTab1[113];
- break;
-
- case 0x14:
- if (intra_luma)
- tab = &RvlcTcoefTab0[4];
- else
- tab = &RvlcTcoefTab1[56];
- break;
-
- case 0x15:
- if (intra_luma)
- tab = &RvlcTcoefTab0[5];
- else
- tab = &RvlcTcoefTab1[60];
- break;
-
- case 0x18:
- if (intra_luma)
- tab = &RvlcTcoefTab0[116];
- else
- tab = &RvlcTcoefTab1[116];
- break;
-
- case 0x19:
- if (intra_luma)
- tab = &RvlcTcoefTab0[118];
- else
- tab = &RvlcTcoefTab1[118];
- break;
-
- case 0x1c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[72];
- else
- tab = &RvlcTcoefTab1[3];
- break;
-
- case 0x1d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[77];
- else
- tab = &RvlcTcoefTab1[30];
- break;
-
- case 0x22:
- if (intra_luma)
- tab = &RvlcTcoefTab0[120];
- else
- tab = &RvlcTcoefTab1[120];
- break;
-
- case 0x23:
- if (intra_luma)
- tab = &RvlcTcoefTab0[122];
- else
- tab = &RvlcTcoefTab1[122];
- break;
-
- case 0x2c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[41];
- else
- tab = &RvlcTcoefTab1[63];
- break;
-
- case 0x2d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[29];
- else
- tab = &RvlcTcoefTab1[66];
- break;
-
- case 0x34:
- if (intra_luma)
- tab = &RvlcTcoefTab0[6];
- else
- tab = &RvlcTcoefTab1[68];
- break;
-
- case 0x35:
- if (intra_luma)
- tab = &RvlcTcoefTab0[124];
- else
- tab = &RvlcTcoefTab1[124];
- break;
-
- case 0x38:
- if (intra_luma)
- tab = &RvlcTcoefTab0[126];
- else
- tab = &RvlcTcoefTab1[126];
- break;
-
- case 0x39:
- if (intra_luma)
- tab = &RvlcTcoefTab0[128];
- else
- tab = &RvlcTcoefTab1[128];
- break;
-
- case 0x3c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[82];
- else
- tab = &RvlcTcoefTab1[4];
- break;
-
- case 0x3d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[86];
- else
- tab = &RvlcTcoefTab1[5];
- break;
-
- case 0x42:
- if (intra_luma)
- tab = &RvlcTcoefTab0[130];
- else
- tab = &RvlcTcoefTab1[130];
- break;
-
- case 0x43:
- if (intra_luma)
- tab = &RvlcTcoefTab0[132];
- else
- tab = &RvlcTcoefTab1[132];
- break;
-
- case 0x5c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[52];
- else
- tab = &RvlcTcoefTab1[21];
- break;
-
- case 0x5d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[61];
- else
- tab = &RvlcTcoefTab1[37];
- break;
-
- case 0x6c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[30];
- else
- tab = &RvlcTcoefTab1[44];
- break;
-
- case 0x6d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[31];
- else
- tab = &RvlcTcoefTab1[70];
- break;
-
- case 0x74:
- if (intra_luma)
- tab = &RvlcTcoefTab0[7];
- else
- tab = &RvlcTcoefTab1[72];
- break;
-
- case 0x75:
- if (intra_luma)
- tab = &RvlcTcoefTab0[8];
- else
- tab = &RvlcTcoefTab1[74];
- break;
-
- case 0x78:
- if (intra_luma)
- tab = &RvlcTcoefTab0[104];
- else
- tab = &RvlcTcoefTab1[104];
- break;
-
- case 0x79:
- if (intra_luma)
- tab = &RvlcTcoefTab0[134];
- else
- tab = &RvlcTcoefTab1[134];
- break;
-
- case 0x7c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[90];
- else
- tab = &RvlcTcoefTab1[6];
- break;
-
- case 0x7d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[67];
- else
- tab = &RvlcTcoefTab1[22];
- break;
-
- case 0x82:
- if (intra_luma)
- tab = &RvlcTcoefTab0[136];
- else
- tab = &RvlcTcoefTab1[136];
- break;
-
- case 0x83:
- if (intra_luma)
- tab = &RvlcTcoefTab0[138];
- else
- tab = &RvlcTcoefTab1[138];
- break;
-
- case 0xbc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[42];
- else
- tab = &RvlcTcoefTab1[31];
- break;
-
- case 0xbd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[53];
- else
- tab = &RvlcTcoefTab1[49];
- break;
-
- case 0xdc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[32];
- else
- tab = &RvlcTcoefTab1[76];
- break;
-
- case 0xdd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[9];
- else
- tab = &RvlcTcoefTab1[78];
- break;
-
- case 0xec:
- if (intra_luma)
- tab = &RvlcTcoefTab0[10];
- else
- tab = &RvlcTcoefTab1[80];
- break;
-
- case 0xed:
- if (intra_luma)
- tab = &RvlcTcoefTab0[109];
- else
- tab = &RvlcTcoefTab1[109];
- break;
-
- case 0xf4:
- if (intra_luma)
- tab = &RvlcTcoefTab0[139];
- else
- tab = &RvlcTcoefTab1[139];
- break;
-
- case 0xf5:
- if (intra_luma)
- tab = &RvlcTcoefTab0[140];
- else
- tab = &RvlcTcoefTab1[140];
- break;
-
- case 0xf8:
- if (intra_luma)
- tab = &RvlcTcoefTab0[141];
- else
- tab = &RvlcTcoefTab1[141];
- break;
-
- case 0xf9:
- if (intra_luma)
- tab = &RvlcTcoefTab0[142];
- else
- tab = &RvlcTcoefTab1[142];
- break;
-
- case 0xfc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[92];
- else
- tab = &RvlcTcoefTab1[7];
- break;
-
- case 0xfd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[94];
- else
- tab = &RvlcTcoefTab1[8];
- break;
-
- case 0x102:
- if (intra_luma)
- tab = &RvlcTcoefTab0[143];
- else
- tab = &RvlcTcoefTab1[143];
- break;
-
- case 0x103:
- if (intra_luma)
- tab = &RvlcTcoefTab0[144];
- else
- tab = &RvlcTcoefTab1[144];
- break;
-
- case 0x17c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[73];
- else
- tab = &RvlcTcoefTab1[23];
- break;
-
- case 0x17d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[78];
- else
- tab = &RvlcTcoefTab1[38];
- break;
-
- case 0x1bc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[83];
- else
- tab = &RvlcTcoefTab1[53];
- break;
-
- case 0x1bd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[62];
- else
- tab = &RvlcTcoefTab1[57];
- break;
-
- case 0x1dc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[43];
- else
- tab = &RvlcTcoefTab1[61];
- break;
-
- case 0x1dd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[33];
- else
- tab = &RvlcTcoefTab1[64];
- break;
-
- case 0x1ec:
- if (intra_luma)
- tab = &RvlcTcoefTab0[11];
- else
- tab = &RvlcTcoefTab1[82];
- break;
-
- case 0x1ed:
- if (intra_luma)
- tab = &RvlcTcoefTab0[12];
- else
- tab = &RvlcTcoefTab1[83];
- break;
-
- case 0x1f4:
- if (intra_luma)
- tab = &RvlcTcoefTab0[13];
- else
- tab = &RvlcTcoefTab1[84];
- break;
-
- case 0x1f5:
- if (intra_luma)
- tab = &RvlcTcoefTab0[145];
- else
- tab = &RvlcTcoefTab1[145];
- break;
-
- case 0x1f8:
- if (intra_luma)
- tab = &RvlcTcoefTab0[146];
- else
- tab = &RvlcTcoefTab1[146];
- break;
-
- case 0x1f9:
- if (intra_luma)
- tab = &RvlcTcoefTab0[147];
- else
- tab = &RvlcTcoefTab1[147];
- break;
-
- case 0x1fc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[96];
- else
- tab = &RvlcTcoefTab1[9];
- break;
-
- case 0x1fd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[87];
- else
- tab = &RvlcTcoefTab1[10];
- break;
-
- case 0x202:
- if (intra_luma)
- tab = &RvlcTcoefTab0[148];
- else
- tab = &RvlcTcoefTab1[148];
- break;
-
- case 0x203:
- if (intra_luma)
- tab = &RvlcTcoefTab0[149];
- else
- tab = &RvlcTcoefTab1[149];
- break;
-
- case 0x2fc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[68];
- else
- tab = &RvlcTcoefTab1[24];
- break;
-
- case 0x2fd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[74];
- else
- tab = &RvlcTcoefTab1[32];
- break;
-
- case 0x37c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[79];
- else
- tab = &RvlcTcoefTab1[45];
- break;
-
- case 0x37d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[54];
- else
- tab = &RvlcTcoefTab1[50];
- break;
-
- case 0x3bc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[44];
- else
- tab = &RvlcTcoefTab1[67];
- break;
-
- case 0x3bd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[45];
- else
- tab = &RvlcTcoefTab1[85];
- break;
-
- case 0x3dc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[34];
- else
- tab = &RvlcTcoefTab1[86];
- break;
-
- case 0x3dd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[35];
- else
- tab = &RvlcTcoefTab1[87];
- break;
-
- case 0x3ec:
- if (intra_luma)
- tab = &RvlcTcoefTab0[14];
- else
- tab = &RvlcTcoefTab1[88];
- break;
-
- case 0x3ed:
- if (intra_luma)
- tab = &RvlcTcoefTab0[15];
- else
- tab = &RvlcTcoefTab1[89];
- break;
-
- case 0x3f4:
- if (intra_luma)
- tab = &RvlcTcoefTab0[16];
- else
- tab = &RvlcTcoefTab1[90];
- break;
-
- case 0x3f5:
- if (intra_luma)
- tab = &RvlcTcoefTab0[105];
- else
- tab = &RvlcTcoefTab1[105];
- break;
-
- case 0x3f8:
- if (intra_luma)
- tab = &RvlcTcoefTab0[114];
- else
- tab = &RvlcTcoefTab1[114];
- break;
-
- case 0x3f9:
- if (intra_luma)
- tab = &RvlcTcoefTab0[150];
- else
- tab = &RvlcTcoefTab1[150];
- break;
-
- case 0x3fc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[91];
- else
- tab = &RvlcTcoefTab1[11];
- break;
-
- case 0x3fd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[63];
- else
- tab = &RvlcTcoefTab1[25];
- break;
-
- case 0x402:
- if (intra_luma)
- tab = &RvlcTcoefTab0[151];
- else
- tab = &RvlcTcoefTab1[151];
- break;
-
- case 0x403:
- if (intra_luma)
- tab = &RvlcTcoefTab0[152];
- else
- tab = &RvlcTcoefTab1[152];
- break;
-
- case 0x5fc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[69];
- else
- tab = &RvlcTcoefTab1[33];
- break;
-
- case 0x5fd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[75];
- else
- tab = &RvlcTcoefTab1[39];
- break;
-
- case 0x6fc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[55];
- else
- tab = &RvlcTcoefTab1[54];
- break;
-
- case 0x6fd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[64];
- else
- tab = &RvlcTcoefTab1[58];
- break;
-
- case 0x77c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[36];
- else
- tab = &RvlcTcoefTab1[69];
- break;
-
- case 0x77d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[17];
- else
- tab = &RvlcTcoefTab1[91];
- break;
-
- case 0x7bc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[18];
- else
- tab = &RvlcTcoefTab1[92];
- break;
-
- case 0x7bd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[21];
- else
- tab = &RvlcTcoefTab1[93];
- break;
-
- case 0x7dc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[110];
- else
- tab = &RvlcTcoefTab1[110];
- break;
-
- case 0x7dd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[117];
- else
- tab = &RvlcTcoefTab1[117];
- break;
-
- case 0x7ec:
- if (intra_luma)
- tab = &RvlcTcoefTab0[119];
- else
- tab = &RvlcTcoefTab1[119];
- break;
-
- case 0x7ed:
- if (intra_luma)
- tab = &RvlcTcoefTab0[153];
- else
- tab = &RvlcTcoefTab1[153];
- break;
-
- case 0x7f4:
- if (intra_luma)
- tab = &RvlcTcoefTab0[154];
- else
- tab = &RvlcTcoefTab1[154];
- break;
-
- case 0x7f5:
- if (intra_luma)
- tab = &RvlcTcoefTab0[155];
- else
- tab = &RvlcTcoefTab1[155];
- break;
-
- case 0x7f8:
- if (intra_luma)
- tab = &RvlcTcoefTab0[156];
- else
- tab = &RvlcTcoefTab1[156];
- break;
-
- case 0x7f9:
- if (intra_luma)
- tab = &RvlcTcoefTab0[157];
- else
- tab = &RvlcTcoefTab1[157];
- break;
-
- case 0x7fc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[97];
- else
- tab = &RvlcTcoefTab1[12];
- break;
-
- case 0x7fd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[98];
- else
- tab = &RvlcTcoefTab1[13];
- break;
-
- case 0x802:
- if (intra_luma)
- tab = &RvlcTcoefTab0[158];
- else
- tab = &RvlcTcoefTab1[158];
- break;
-
- case 0x803:
- if (intra_luma)
- tab = &RvlcTcoefTab0[159];
- else
- tab = &RvlcTcoefTab1[159];
- break;
-
- case 0xbfc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[93];
- else
- tab = &RvlcTcoefTab1[14];
- break;
-
- case 0xbfd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[84];
- else
- tab = &RvlcTcoefTab1[15];
- break;
-
- case 0xdfc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[88];
- else
- tab = &RvlcTcoefTab1[26];
- break;
-
- case 0xdfd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[80];
- else
- tab = &RvlcTcoefTab1[40];
- break;
-
- case 0xefc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[56];
- else
- tab = &RvlcTcoefTab1[46];
- break;
-
- case 0xefd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[46];
- else
- tab = &RvlcTcoefTab1[51];
- break;
-
- case 0xf7c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[47];
- else
- tab = &RvlcTcoefTab1[62];
- break;
-
- case 0xf7d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[48];
- else
- tab = &RvlcTcoefTab1[71];
- break;
-
- case 0xfbc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[37];
- else
- tab = &RvlcTcoefTab1[94];
- break;
-
- case 0xfbd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[19];
- else
- tab = &RvlcTcoefTab1[95];
- break;
-
- case 0xfdc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[20];
- else
- tab = &RvlcTcoefTab1[96];
- break;
-
- case 0xfdd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[22];
- else
- tab = &RvlcTcoefTab1[97];
- break;
-
- case 0xfec:
- if (intra_luma)
- tab = &RvlcTcoefTab0[106];
- else
- tab = &RvlcTcoefTab1[106];
- break;
-
- case 0xfed:
- if (intra_luma)
- tab = &RvlcTcoefTab0[121];
- else
- tab = &RvlcTcoefTab1[121];
- break;
-
- case 0xff4:
- if (intra_luma)
- tab = &RvlcTcoefTab0[123];
- else
- tab = &RvlcTcoefTab1[123];
- break;
-
- case 0xff5:
- if (intra_luma)
- tab = &RvlcTcoefTab0[125];
- else
- tab = &RvlcTcoefTab1[125];
- break;
-
- case 0xff8:
- if (intra_luma)
- tab = &RvlcTcoefTab0[127];
- else
- tab = &RvlcTcoefTab1[127];
- break;
-
- case 0xff9:
- if (intra_luma)
- tab = &RvlcTcoefTab0[129];
- else
- tab = &RvlcTcoefTab1[129];
- break;
-
- case 0xffc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[99];
- else
- tab = &RvlcTcoefTab1[16];
- break;
-
- case 0xffd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[100];
- else
- tab = &RvlcTcoefTab1[17];
- break;
-
- case 0x1002:
- if (intra_luma)
- tab = &RvlcTcoefTab0[160];
- else
- tab = &RvlcTcoefTab1[160];
- break;
-
- case 0x1003:
- if (intra_luma)
- tab = &RvlcTcoefTab0[161];
- else
- tab = &RvlcTcoefTab1[161];
- break;
-
- case 0x17fc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[101];
- else
- tab = &RvlcTcoefTab1[27];
- break;
-
- case 0x17fd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[85];
- else
- tab = &RvlcTcoefTab1[28];
- break;
-
- case 0x1bfc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[70];
- else
- tab = &RvlcTcoefTab1[34];
- break;
-
- case 0x1bfd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[65];
- else
- tab = &RvlcTcoefTab1[35];
- break;
-
- case 0x1dfc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[71];
- else
- tab = &RvlcTcoefTab1[41];
- break;
-
- case 0x1dfd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[57];
- else
- tab = &RvlcTcoefTab1[55];
- break;
-
- case 0x1efc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[58];
- else
- tab = &RvlcTcoefTab1[65];
- break;
-
- case 0x1efd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[49];
- else
- tab = &RvlcTcoefTab1[73];
- break;
-
- case 0x1f7c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[50];
- else
- tab = &RvlcTcoefTab1[75];
- break;
-
- case 0x1f7d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[38];
- else
- tab = &RvlcTcoefTab1[77];
- break;
-
- case 0x1fbc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[39];
- else
- tab = &RvlcTcoefTab1[79];
- break;
-
- case 0x1fbd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[23];
- else
- tab = &RvlcTcoefTab1[98];
- break;
-
- case 0x1fdc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[24];
- else
- tab = &RvlcTcoefTab1[99];
- break;
-
- case 0x1fdd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[25];
- else
- tab = &RvlcTcoefTab1[100];
- break;
-
- case 0x1fec:
- if (intra_luma)
- tab = &RvlcTcoefTab0[107];
- else
- tab = &RvlcTcoefTab1[107];
- break;
-
- case 0x1fed:
- if (intra_luma)
- tab = &RvlcTcoefTab0[111];
- else
- tab = &RvlcTcoefTab1[111];
- break;
-
- case 0x1ff4:
- if (intra_luma)
- tab = &RvlcTcoefTab0[131];
- else
- tab = &RvlcTcoefTab1[131];
- break;
-
- case 0x1ff5:
- if (intra_luma)
- tab = &RvlcTcoefTab0[133];
- else
- tab = &RvlcTcoefTab1[133];
- break;
-
- case 0x1ff8:
- if (intra_luma)
- tab = &RvlcTcoefTab0[135];
- else
- tab = &RvlcTcoefTab1[135];
- break;
-
- case 0x1ff9:
- if (intra_luma)
- tab = &RvlcTcoefTab0[162];
- else
- tab = &RvlcTcoefTab1[162];
- break;
-
- case 0x1ffc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[26];
- else
- tab = &RvlcTcoefTab1[18];
- break;
-
- case 0x1ffd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[59];
- else
- tab = &RvlcTcoefTab1[42];
- break;
-
- case 0x2002:
- if (intra_luma)
- tab = &RvlcTcoefTab0[163];
- else
- tab = &RvlcTcoefTab1[163];
- break;
-
- case 0x2003:
- if (intra_luma)
- tab = &RvlcTcoefTab0[164];
- else
- tab = &RvlcTcoefTab1[164];
- break;
-
- case 0x2ffc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[76];
- else
- tab = &RvlcTcoefTab1[47];
- break;
-
- case 0x2ffd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[81];
- else
- tab = &RvlcTcoefTab1[59];
- break;
-
- case 0x37fc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[89];
- else
- tab = &RvlcTcoefTab1[81];
- break;
-
- case 0x37fd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[95];
- else
- tab = &RvlcTcoefTab1[101];
- break;
-
- case 0x3bfc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[102];
- else
- tab = &RvlcTcoefTab1[102];
- break;
-
- case 0x3bfd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[112];
- else
- tab = &RvlcTcoefTab1[112];
- break;
-
- case 0x3dfc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[115];
- else
- tab = &RvlcTcoefTab1[115];
- break;
-
- case 0x3dfd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[137];
- else
- tab = &RvlcTcoefTab1[137];
- break;
-
- case 0x3efc:
- if (intra_luma)
- tab = &RvlcTcoefTab0[165];
- else
- tab = &RvlcTcoefTab1[165];
- break;
-
- case 0x3efd:
- if (intra_luma)
- tab = &RvlcTcoefTab0[166];
- else
- tab = &RvlcTcoefTab1[166];
- break;
-
- case 0x3f7c:
- if (intra_luma)
- tab = &RvlcTcoefTab0[167];
- else
- tab = &RvlcTcoefTab1[167];
- break;
-
- case 0x3f7d:
- if (intra_luma)
- tab = &RvlcTcoefTab0[168];
- else
- tab = &RvlcTcoefTab1[168];
- break;
-
- default:
- deb("ERROR - illegal RVLC TCOEF\n");
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- *index = tab->val;
- *length = tab->len;
-
- return VDX_OK;
-}
-
-/*
- * vdxGetRVLCDCTBlock
- *
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * startIndex the first index in block where to put data
- * block array for block (length 64)
- * fIntraBlock indicates an intra "1" or inter "0" Block
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function reads a block from bit buffer using Huffman codes listed
- * in RVLC TCOEF table. The place, where the block is read is given as a
- * pointer parameter.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- *
- *
- */
-
-int vdxGetRVLCDCTBlock(
- bibBuffer_t *inBuffer,
- int startIndex,
- int fIntraBlock,
- int *block,
- int *bitErrorIndication)
-{
- int numBitsGot,
- retValue = VDX_OK,
- index = startIndex, /* index to zigzag table running from 1 to 63 */
- tmpvar;
- u_int32
- bits,
- RVLCIndex = 0,
- RVLCLength = 0;
- int16
- bibError = 0;
-
- int run, /* RUN code */
- level; /* LEVEL code */
- u_int32
- last, /* LAST code (see standard) */
- sign; /* sign for level */
-
- vdxAssert(inBuffer != NULL);
- vdxAssert(startIndex == 0 || startIndex == 1);
- vdxAssert(block != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- do {
-
- /* Read next codeword */
- bits = (int) bibShowBits(15, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- deb("vdxGetRVLCDCTBlock: bibShowBits returned not enough data --> "
- "try to use the data available.\n");
- bits <<= (15 - numBitsGot);
- bibError = 0;
- }
- else if (bibError ) {
- deb("vdxGetRVLCDCTBlock: ERROR - bibShowBits failed.\n");
- goto exitFunction;
- }
-
- /* Identifying the codeword in the read bits */
- {
- int count, len = 1;
- u_int32 mask = 0x4000; /* mask 100000000000000 */
-
- if (bits & mask) {
- count = 1;
- for (len = 1; count > 0 && len < 15; len++) {
- mask = mask >> 1;
- if (bits & mask)
- count--;
- }
- } else {
- count = 2;
- for (len = 1; count > 0 && len < 15; len++) {
- mask = mask >> 1;
- if (!(bits & mask))
- count--;
- }
- }
-
- if (len >= 15) {
- deb("vdxGetRVLCDCTBlock:ERROR - illegal RVLC codeword.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- bits = bits & 0x7fff;
- bits = bits >> (15 - (len + 1));
- }
-
- /* Get the RVLC table Index and length belonging to the codeword */
- if (vdxGetRVLCIndex(bits, &RVLCIndex, (int *) &RVLCLength, fIntraBlock, bitErrorIndication) != VDX_OK)
- goto exitFunction;
-
- /* Flush the codeword from the buffer */
- bibFlushBits(RVLCLength, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if (bibError)
- goto exitFunction;
-
- if (RVLCIndex == 7167) /* ESCAPE */
- {
- /* Flush the rest of the ESCAPE code from the buffer */
- bibFlushBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
- if (bibError)
- goto exitFunction;
-
- /* LAST */
- last = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError)
- goto exitFunction;
- /* RUN */
- run = (int) bibGetBits(6, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError)
- goto exitFunction;
- /* MARKER BIT */
- tmpvar = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,&bibError);
- if (bibError)
- goto exitFunction;
- if (!tmpvar) {
- deb("vdxGetRVLCDCTBlock:ERROR - Wrong marker bit.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
- /* LEVEL */
- level = (int) bibGetBits(11, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError)
- goto exitFunction;
- if (level == 0) {
- deb("vdxGetRVLCDCTBlock:ERROR - Escape level invalid.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
- /* MARKER BIT */
- tmpvar = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,&bibError);
- if (bibError)
- goto exitFunction;
- if (!tmpvar) {
- deb("vdxGetRVLCDCTBlock:ERROR - Wrong marker bit.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
- /* SIGN */
- sign = bibGetBits(5, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError)
- goto exitFunction;
-
- if (sign == 1) {
- level = -level;
- } else if (sign != 0) {
- deb("vdxGetRVLCDCTBlock:ERROR - illegal sign.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- } else {
-
- last = (RVLCIndex >> 16) & 1;
- run = (RVLCIndex >> 8) & 255;
- level = RVLCIndex & 255;
-
- sign = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError)
- goto exitFunction;
-
- if (sign)
- level = -level;
- }
-
- /* If too many coefficients */
- if (index + run > 63) {
- deb("vdxGetRVLCDCTBlock:ERROR - too many TCOEFs.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- /* Do run-length decoding */
- while (run--)
- block[index++] = 0;
-
- block[index++] = level;
-
- } while (!last);
-
- exitFunction:
-
- /* Set the rest of the coefficients to zero */
- while (index <= 63) {
- block[index++] = 0;
- }
-
- if (!bibError)
- return retValue;
-
- else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- }
-
- else
- return VDX_ERR_BIB;
-}
-
-/*
- * vdxGetRVLCDCTBlockBackwards
- *
- *
- * Parameters:
- * inBuffer pointer to bit buffer instance
- * startIndex the first index in block where to put data
- * fIntraBlock indicates an intra "1" or inter "0" Block
- * BitPosBeforeRVLC bit position of inBuffer before the RVLC block,
- * indicates the point to stop decoding backwards
- * block array for block (length 64)
- * bitErrorIndication non-zero if a bit error has been detected
- * within the bits accessed in this function,
- * see biterr.h for possible values
- *
- * Function:
- * This function reads a block in backwards direction from the bit buffer
- * using Huffman codes listed in RVLC TCOEF table. The bit position of the
- * buffer at return from the function is where the DCT data of the current
- * block starts.
- *
- * Returns:
- * VDX_OK the function was successful
- * VDX_OK_BUT_BIT_ERROR the function behaved normally, but a bit error
- * occured
- * VDX_ERR_BIB an error occured when accessing bit buffer
- *
- *
- *
- */
-
-int vdxGetRVLCDCTBlockBackwards(
- bibBuffer_t *inBuffer,
- int startIndex,
- int fIntraBlock,
-// u_int32 BitPosBeforeRVLC,
- int *block,
- int *bitErrorIndication)
-{
- int numBitsGot,
- retValue = VDX_OK,
- index = 63; /* index to zigzag table running from 1 to 63 */
- u_int32
- bits,
- RVLCIndex = 0,
- RVLCLength = 0;
- int16
- bibError = 0;
-
- int run, /* RUN code */
- level; /* LEVEL code */
- u_int32
- last, /* LAST code (see standard) */
- sign, /* sign for level */
- escape;
-
- vdxAssert(inBuffer != NULL);
- vdxAssert(startIndex == 0 || startIndex == 1);
- vdxAssert(block != NULL);
- vdxAssert(bitErrorIndication != NULL);
-
- do {
- /* SIGN */
- bibRewindBits(1, inBuffer, &bibError);
- if (bibError)
- goto exitFunction;
- sign = bibShowBits(1, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError) {
- goto exitFunction;
- }
-
- /* Read next codeword */
- bibRewindBits(15, inBuffer, &bibError);
- if (bibError)
- goto exitFunction;
- bits = (int) bibGetBits(15, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- deb("vdxGetRVLCDCTBlockBackwards: bibShowBits returned not enough data --> "
- "try to use the data available.\n");
- bits <<= (15 - numBitsGot);
- bibError = 0;
- }
- else if (bibError) {
- deb("vdxGetRVLCDCTBlockBackwards: ERROR - bibGetBits failed.\n");
- goto exitFunction;
- }
-
- /* Identifying the codeword in the read bits */
- {
- int count, len = 1;
- u_int32 mask = 2; /* mask 000000000000010 */
-
- if (bits & mask) {
- count = 1;
- for (len = 1; count > 0 && len < 15; len++) {
- mask = mask << 1;
- if (bits & mask)
- count--;
- }
- } else {
- count = 2;
- for (len = 1; count > 0 && len < 15; len++) {
- mask = mask << 1;
- if (!(bits & mask))
- count--;
- }
- }
-
- if (len >= 15) {
- deb("vdxGetRVLCDCTBlockBackwards:ERROR - illegal RVLC codeword.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- bits = bits & (0x7fff >> (15 - (len + 1)));
- }
-
- /* Get the RVLC table Index and length belonging to the codeword */
- if (vdxGetRVLCIndex(bits, &RVLCIndex, (int *) &RVLCLength, fIntraBlock, bitErrorIndication) != VDX_OK)
- goto exitFunction;
-
- /* Flush the codeword from the buffer */
- bibRewindBits(RVLCLength, inBuffer, &bibError);
- if (bibError)
- goto exitFunction;
-
- if (RVLCIndex == 7167) /* ESCAPE */
- {
- /* MARKER BIT */
- bibRewindBits(1, inBuffer, &bibError);
- if (bibError)
- goto exitFunction;
- if(!bibShowBits(1, inBuffer, &numBitsGot, bitErrorIndication,&bibError)
- || bibError ) {
- deb("vdxGetRVLCDCTBlockBackwards:ERROR - Wrong marker bit.\n");
- if ( !bibError )
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
- /* LEVEL */
- bibRewindBits(11, inBuffer, &bibError);
- if (bibError)
- goto exitFunction;
- level = (int) bibShowBits(11, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (level == 0 || bibError ) {
- if (!bibError) {
- deb("vdxGetRVLCDCTBlockBackwards:ERROR - Invalid Level.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- }
- goto exitFunction;
- }
- /* MARKER BIT */
- bibRewindBits(1, inBuffer, &bibError);
- if (bibError)
- goto exitFunction;
- if(!bibShowBits(1, inBuffer, &numBitsGot, bitErrorIndication,&bibError)
- || bibError ) {
- if ( !bibError ) {
- deb("vdxGetRVLCDCTBlockBackwards:ERROR - Wrong marker bit.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- }
- goto exitFunction;
- }
- /* RUN */
- bibRewindBits(6, inBuffer, &bibError);
- if (bibError)
- goto exitFunction;
- run = (int) bibShowBits(6, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError) {
- goto exitFunction;
- }
- /* LAST */
- bibRewindBits(1, inBuffer, &bibError);
- if (bibError)
- goto exitFunction;
- last = bibShowBits(1, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError) {
- goto exitFunction;
- }
-
- /* Get the first ESCAPE code from the buffer */
- bibRewindBits(5, inBuffer, &bibError);
- if (bibError)
- goto exitFunction;
- escape = bibShowBits(5, inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError) {
- goto exitFunction;
- }
-
- if (escape != 1) {
- deb("vdxGetRVLCDCTBlockBackwards:ERROR - illegal escape code.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- }
-
- RVLCLength += 25;
-
- } else {
-
- last = (RVLCIndex >> 16) & 1;
- run = (RVLCIndex >> 8) & 255;
- level = RVLCIndex & 255;
- }
-
- if (sign)
- level = -level;
-
- if (index == 63) {
- if (!last) {
- deb("vdxGetRVLCDCTBlockBackwards:ERROR - last TCOEFF problem.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
- } else
- last = 0;
- }
-
- if (last) {
- bibFlushBits((RVLCLength + 1), inBuffer, &numBitsGot, bitErrorIndication,
- &bibError);
- if (bibError)
- goto exitFunction;
-
- } else if (index - run < startIndex) {
- deb("vdxGetRVLCDCTBlockBackwards:ERROR - too many TCOEFFs.\n");
- retValue = VDX_OK_BUT_BIT_ERROR;
- goto exitFunction;
-
- } else {
- /* Do run-length decoding. Since we are decoding backwards, level has to be inserted first */
- block[index--] = level;
-
- while (run--)
- block[index--] = 0;
-
- }
-
- } while (!last);
-
- exitFunction:
-
- {
- int i;
- for(i=startIndex,index++; i<=63; i++,index++)
- block[i]= (index <= 63) ? block[index] : 0;
- }
-
-
- if (!bibError)
- return retValue;
- else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
- return VDX_OK_BUT_BIT_ERROR;
- } else
- return VDX_ERR_BIB;
-}
-
-// End of File