diff -r 951a5db380a0 -r d87d32eab1a9 videoeditorengine/h263decoder/src/viddemux_mpeg.cpp --- 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) ? 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