You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

245 lines
18 KiB

;* ======================================================================== *;
;* TEXAS INSTRUMENTS, INC. *;
;* *;
;* IMGLIB DSP Image/Video Processing Library *;
;* *;
;* Release: Revision 1.04b *;
;* CVS Revision: 1.16 Sun Sep 29 03:32:26 2002 (UTC) *;
;* Snapshot date: 23-Oct-2003 *;
;* *;
;* This library contains proprietary intellectual property of Texas *;
;* Instruments, Inc. The library and its source code are protected by *;
;* various copyrights, and portions may also be protected by patents or *;
;* other legal protections. *;
;* *;
;* This software is licensed for use with Texas Instruments TMS320 *;
;* family DSPs. This license was provided to you prior to installing *;
;* the software. You may review this license by consulting the file *;
;* TI_license.PDF which accompanies the files in this library. *;
;* ------------------------------------------------------------------------ *;
;* Copyright (C) 2003 Texas Instruments, Incorporated. *;
;* All Rights Reserved. *;
;* ======================================================================== *;
;* ======================================================================== *;
;* Assembler compatibility shim for assembling 4.30 and later code on *;
;* tools prior to 4.30. *;
;* ======================================================================== *;
;* ======================================================================== *;
;* End of assembler compatibility shim. *;
;* ======================================================================== *;
* ========================================================================= *
* TEXAS INSTRUMENTS, INC. *
* *
* NAME *
* IMG_mpeg2_vld_intra *
* *
* PLATFORM *
* C6400 *
* *
* REVISION DATE *
* 22-May-2002 *
* *
* DESCRIPTION *
* This routine takes a bitstream of an MPEG-2 intra coded macroblock *
* and returns the decoded IDCT coefficients. The routine is *
* implemented as specified in the MPEG-2 standard text (ISO/IEC *
* 13818-2). The routine checks the coded block pattern (cbp), *
* performs DC and AC decoding inlcuding, variable length decode, *
* run-length expansion, inverse zigzag, dequantization, saturation *
* and mismatch control. *
* *
* USAGE *
* This routine is C callable, and has the following C prototype: *
* *
* void IMG_mpeg2_vld_intra *
* ( *
* const short *restrict Wptr, *
* short *restrict outi, *
* IMG_mpeg2_vld *restrict Mpeg2v, *
* int dc_pred[3], *
* int mode_12Q4, *
* int num_blocks, *
* int bsbuf_words *
* ); *
* *
* Wptr: Pointer to array that contains quantization matrix. The *
* elements of the quantization matrix in *Wptr must be *
* ordered according to the scan pattern used (zigzag or *
* alternate scan). Video format 4:2:0 requires one *
* quantization matrix (64 array elements). For formats *
* 4:2:2 and 4:4:4 two quantization matrices (one for luma *
* and one for chroma) must specified in the array (128 *
* array elements). *
* *
* outi: Pointer to the IDCT coefficients output array *
* (6*64 elements), elements must be set to zero prior to *
* function call. *
* *
* Mpeg2v: Pointer to the context object containing the coding *
* parameters of the MB to be decoded and the current state *
* of the bitstream buffer. The structure is described *
* below. *
* *
* dc_pred: Intra DC prediction array, the first element of dc_pred *
* is the DC prediction for Y, the second for Cr and the *
* third for Cb. *
* *
* mode_12Q4: 0: Coefficients are returned in normal 16-bit integer *
* format. *
* Otherwise: Coefficients are returned in 12Q4 format *
* (normal 16-bit integer format left shifted by 4). This *
* mode is useful for directly passing the coefficients *
* into the IMG_idct_8x8 routine. *
* *
* num_blocks: Number of blocks that the MB contains. Valid values are *
* 6 for 4:2:0, 8 for 4:2:2 and 12 for 4:4:4 format. *
* *
* bsbuf_words: Size of bitstream buffer in words. Must be a power of 2. *
* Bitstream buffer must be aligned at an address boundary *
* equal to its size in bytes (bitstream buffer is *
* addressed circularly by this routine.) *
* *
* The structure Mpeg2v is defined as follows: *
* *
* #ifndef IMG_MPEG2_VLD_STRUCT_ *
* #define IMG_MPEG2_VLD_STRUCT_ 1 *
* *
* typedef struct { *
* unsigned int *bsbuf; // pointer to bitstream buffer *
* unsigned int next_wptr; // next word to read from buffer *
* unsigned int bptr; // bit position within word *
* unsigned int word1; // word aligned buffer *
* unsigned int word2; // word aligned buffer *
* unsigned int top0; // top 32 bits of bitstream *
* unsigned int top1; // next 32 bits of bitstream *
* const unsigned char *scan; // inverse zigzag scan matrix *
* unsigned int intravlc; // intra_vlc_format *
* unsigned int quant_scale; // quant_scale *
* unsigned int dc_prec; // intra_dc_precision *
* unsigned int cbp; // coded_block_pattern *
* unsigned int fault; // fault condition (returned) *
* unsigned int reserved; // reserved *
* } IMG_mpeg2_vld; *
* *
* #endif *
* *
* The Mpeg2v variables should have a fixed layout since they are *
* accessed by this routine. If the layout is changed, the *
* corresponding changes have to be made in the assembly code too. *
* *
* The routine sets the fault flag Mpeg2v.fault to 1 if an invalid *
* VLC code was encountered or the total run went beyond 63. In *
* theses cases the decoder has to resynchronize. *
* *
* The required lookup tables for this routine are provided in *
* IMGLIB and are linked in automatically when linking against *
* IMGLIB. *
* *
* Before calling the routine the bitstream variables in Mpeg2v *
* have to be initialized. If bsbuf is a circular buffer and bsptr *
* contains the number of bits in the buffer that already have *
* been consumed, then next_wptr, bptr, word1, word2, top0 and *
* top1 are initialized as follows: *
* *
* 1. nextwptr: bsptr may not be a multiple of 32, therefore obtain *
* the next lower multiple of 32. *
* *
* next_wptr = (bsptr >> 5); *
* *
* 2. bptr: bptr is the bit pointer which points to the current *
* bit WITHIN the word pointed to by next_wptr. *
* *
* bptr = bsptr & 31; *
* bptr_cmpl = 32 - bptr; *
* *
* 3. word1 and word2: read next 3 words from the bitstream buffer *
* (word0 is a temporary variable). bsbuf_words is the size of the *
* bitstream buffer in words. *
* *
* word0 = bsbuf[next_wptr]; *
* next_wptr = (next_wptr + 1) & (bsbuf_words-1); *
* *
* word1 = bsbuf[next_wptr]; *
* next_wptr = (next_wptr + 1) & (bsbuf_words-1); *
* *
* word2 = bsbuf[next_wptr]; *
* next_wptr = (next_wptr + 1) & (bsbuf_words-1); *
* *
* 4. top0 and top1: Shift words word0, word1, word2 by bptr to the *
* left so that the current bit becomes the MSB in word0. word0 can *
* simply be shifted by bptr; the then empty LSBs of word0 have to be *
* filled with the MSBs of word1. To do that the required MSBs are *
* brought into the position of empty LSBs of word0 by shifting word1 *
* to the right by (32-bptr). The result is then copied into word0 by *
* an addition. Rather than overwriting word0, top0 is used to hold *
* the new bit aligned word. The same procedure is used to obtain *
* top1. top0 and top1 contain the next 64 bits of the bitstream. *
* *
* s1 = word0 << bptr; *
* s2 = word1 >> bptr_cmpl; /* unsigned right-shift */ *
* top0 = s1 + s2; *
* *
* s3 = word1 << bptr; *
* s4 = word2 >> bptr_cmpl; /* unsigned right-shift */ *
* top1 = s3 + s4; *
* *
* Note that the routine returns the updated state of the bitstream *
* buffer variables, top0, top1, word1, word2, bptr and next_wptr. If *
* all other functions which access the bitstream in a decoder system *
* maintain the buffer variables in the same way, then the above *
* initialization procedure has to be performed only once at the *
* beginning. *
* *
* TECHNIQUES *
* The instruction NORM is used to detect the number of leading zeros *
* or ones in a code word. This value together with additional bits *
* extracted from the codeword is then used as an index into look-up *
* tables to determine the length, run, level and sign. Escape code *
* sequences are directly extracted from the code word. *
* *
* DC coefficients are decoded without lookup tables by exploiting *
* the relatively simple relationship between the number of leading *
* zeros and dc_size and the length of the code word. *
* *
* ASSUMPTIONS *
* The bitstream must be stored in memory in 32-bit words which are *
* in little endian byte order. *
* *
* Wptr is allowed to overrun once (to detect total run overrun), so *
* maximum overrun that can occur is 66 (Error mark). Therefore, *
* in memory 66+1 halfwords behind the weighting matrix should be *
* valid (e.g. peripherals). No memory is overwritten, *
* only loads occurr. *
* *
* Note that the AMR register is set to zero on exit. *
* *
* NOTES *
* This code is little ENDIAN. *
* This code is interrupt-tolerant but not interruptible. *
* *
* MEMORY NOTES *
* No bank conflicts *
* *
* CYCLES *
* 10 * (S - CB) + 55 * CB + 15 * NCB + 35 *
* where S: Number of symbols in MB, CB: Number of coded blocks, *
* NCB: Number of not-coded blocks, and CB+NCB=6 *
* *
* CODE SIZE *
* 1508 bytes *
* *
* DATA SIZE *
* 3584 bytes for the lookup tables *
* ------------------------------------------------------------------------- *
* Copyright (c) 2003 Texas Instruments, Incorporated. *
* All Rights Reserved. *
* ========================================================================= *
.global _IMG_mpeg2_vld_intra
* ========================================================================= *
* End of file: img_mpeg2_vld_intra.h64 *
* ------------------------------------------------------------------------- *
* Copyright (c) 2003 Texas Instruments, Incorporated. *
* All Rights Reserved. *
* ========================================================================= *