⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcr.c

📁 mpeg4 video codec mpeg4 video codec
💻 C
📖 第 1 页 / 共 2 页
字号:
                            /* process only sfb's that are due now */                            ((ics->sect_start[g][i] <= sfb) && (ics->sect_end[g][i] > sfb))                            )                        {                            if ((sect_cb != ZERO_HCB) &&                                (sect_cb != NOISE_HCB) &&                                (sect_cb != INTENSITY_HCB) &&                                (sect_cb != INTENSITY_HCB2))                            {                                uint8_t inc = (sect_cb < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN;                                uint16_t k;                                uint32_t	hw, lw;                                for  (k=0; (k < (4/inc)*ics->window_group_length[g]) &&                                    ( (k+w*ics->window_group_length[g]/inc) < (ics->sect_sfb_offset[g][sfb+1] - ics->sect_sfb_offset[g][sfb])); k++)                                {                                    uint16_t sp = sp_offset[g] + ics->sect_sfb_offset[g][sfb] + inc*(k+w*ics->window_group_length[g]/inc);                                    if (!PCW_decoded)                                    {                                        /* if we haven't yet read until the end of the buffer, we can directly decode the so-called PCWs */                                        if ((BitsRead + segmentWidth( sect_cb ))<= ics->length_of_reordered_spectral_data)                                        {                                            Segment[ numberOfSegments ].len = segmentWidth( sect_cb );                                            if (segmentWidth( sect_cb ) > 32)                                            {                                                Segment[ numberOfSegments ].bufb = faad_showbits(ld, segmentWidth( sect_cb ) - 32);                                                faad_flushbits(ld, segmentWidth( sect_cb) - 32);                                                Segment[ numberOfSegments ].bufa = faad_showbits(ld, 32),                                                    faad_flushbits(ld, 32 );                                            } else {                                                Segment[ numberOfSegments ].bufa = faad_showbits(ld,  segmentWidth( sect_cb ));                                                Segment[ numberOfSegments ].bufb = 0;                                                faad_flushbits(ld, segmentWidth( sect_cb) );                                            }                                            huffman_spectral_data_2(sect_cb, &Segment[ numberOfSegments ], &spectral_data[sp]);                                            BitsRead += segmentWidth( sect_cb );                                            /* skip to next segment, but store left bits in new buffer */                                            rewind_bits( &Segment[ numberOfSegments ]);                                            numberOfSegments++;                                        } else {                                            /* the last segment is extended until length_of_reordered_spectral_data */                                            if (BitsRead < ics->length_of_reordered_spectral_data)                                            {                                                uint8_t additional_bits = (ics->length_of_reordered_spectral_data - BitsRead);                                                if ( additional_bits > 32)                                                {                                                    hw = faad_showbits(ld, additional_bits - 32);                                                    faad_flushbits(ld, additional_bits - 32);                                                    lw = faad_showbits(ld, 32);                                                    faad_flushbits(ld, 32 );                                                } else {                                                    lw = faad_showbits(ld, additional_bits);                                                    hw = 0;                                                    faad_flushbits(ld, additional_bits );                                                }                                                rewind_lword( &hw, &lw, additional_bits + Segment[ numberOfSegments-1 ].len );                                                if (Segment[ numberOfSegments-1 ].len > 32)                                                {                                                    Segment[ numberOfSegments-1 ].bufb = hw +                                                         showbits_hcr(&Segment[ numberOfSegments-1 ], Segment[ numberOfSegments-1 ].len - 32);                                                    Segment[ numberOfSegments-1 ].bufa = lw +                                                         showbits_hcr(&Segment[ numberOfSegments-1 ], 32);                                                } else {                                                    Segment[ numberOfSegments-1 ].bufa = lw +                                                         showbits_hcr(&Segment[ numberOfSegments-1 ], Segment[ numberOfSegments-1 ].len);                                                    Segment[ numberOfSegments-1 ].bufb = hw;                                                }                                                Segment[ numberOfSegments-1 ].len += additional_bits;                                            }                                            BitsRead = ics->length_of_reordered_spectral_data;                                            PCW_decoded = 1;                                            Codewords[ 0 ].sp_offset = sp;                                            Codewords[ 0 ].cb = sect_cb;                                            Codewords[ 0 ].decoded = 0;                                            Codewords[ 0 ].bits.len = 0;                                        }                                    } else {                                        Codewords[ NrCodeWords - numberOfSegments ].sp_offset = sp;                                        Codewords[ NrCodeWords - numberOfSegments ].cb = sect_cb;                                        Codewords[ NrCodeWords - numberOfSegments ].decoded = 0;                                        Codewords[ NrCodeWords - numberOfSegments ].bits.len = 0;                                    } /* PCW decoded */                                    NrCodeWords++;                                } /* of k */                            }                        }                    } /* of i */                 } /* of g */             } /* of w */         } /* of sfb */    } /* of presort */    /* Avoid divide by zero */    if (numberOfSegments == 0)        return 10; /* this is not good... */    numberOfSets = NrCodeWords / numberOfSegments;         /* second step: decode nonPCWs */    for (set = 1; set <= numberOfSets; set++)    {        uint16_t trial;        for (trial = 0; trial < numberOfSegments; trial++)        {            uint16_t codewordBase;            uint16_t set_decoded=numberOfSegments;            if (set == numberOfSets)                set_decoded = NrCodeWords - set*numberOfSegments;	/* last set is shorter than the rest */            for (codewordBase = 0; codewordBase < numberOfSegments; codewordBase++)            {                uint16_t segment_index = (trial + codewordBase) % numberOfSegments;                uint16_t codeword_index = codewordBase + set*numberOfSegments - numberOfSegments;                if ((codeword_index + numberOfSegments) >= NrCodeWords)                    break;                if (!Codewords[ codeword_index ].decoded)                {                    if ( Segment[ segment_index ].len > 0)                    {                        uint8_t tmplen;                        if (Codewords[ codeword_index ].bits.len != 0)                        {                            /* on the first trial the data is only stored in Segment[], not in Codewords[].                                On next trials first collect the data stored for this codeword and                               concatenate the new data from Segment[] */                            concat_bits( &Codewords[ codeword_index ].bits, &Segment[ segment_index ]);                                                        /* Now everthing is stored in Segment[] */                        }                        tmplen = Segment[ segment_index ].len;                        if ( huffman_spectral_data_2(Codewords[ codeword_index ].cb, &Segment[ segment_index ],                            &spectral_data[ Codewords[ codeword_index ].sp_offset ]) >=0)                        {                            /* CW did fit into segment */                            Codewords[ codeword_index ].decoded = 1;                            set_decoded--;                        } else {                            /* CW did not fit, so store for later use */                            Codewords[ codeword_index ].bits.len = tmplen;                            Codewords[ codeword_index ].bits.bufa = Segment[ segment_index ].bufa;                            Codewords[ codeword_index ].bits.bufb = Segment[ segment_index ].bufb;                        }                    }                                        }            } /* of codewordBase */            if (set_decoded == 0) break;	/* no undecoded codewords left in this set */        } /* of trial */        /* rewind all bits in remaining segments with len>0 */        for (i=0; i < numberOfSegments; i++)            rewind_bits( &Segment[ i ] );    }#if 0    {        int i, r=0, c=0;        for (i=0; i< numberOfSegments; i++)            r += Segment[ i ].len;        if (r != 0)        {            printf("reordered_spectral_data: %d bits remaining!\n", r);        }        for (i=0; i< NrCodeWords - numberOfSegments; i++)        {            if (Codewords[ i ].decoded == 0)            {                c++;            }        }        if (c != 0)        {            printf("reordered_spectral_data: %d Undecoded Codewords remaining!\n",c );        }        if ((r !=0) || (c!=0))	return 10;    }#endif    return 0;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -