13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h"
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h"
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h"
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "zigzag.h"
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_DecodePredictedIntraDC(
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int compnum,
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream,
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *INTRADC_delta)
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint DC_size;
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int first_bit;
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* read DC size 2 - 8 bits */
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    status = PV_VlcDecIntraDCPredSize(stream, compnum, &DC_size);
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (status == PV_SUCCESS)
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (DC_size == 0)
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *INTRADC_delta = 0;
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* read delta DC 0 - 8 bits */
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            code = (int) BitstreamReadBits16_INLINE(stream, DC_size);
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            first_bit = code >> (DC_size - 1);
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (first_bit == 0)
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* negative delta INTRA DC */
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *INTRADC_delta = code ^((1 << DC_size) - 1);
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *INTRADC_delta = -(*INTRADC_delta);
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            { /* positive delta INTRA DC */
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *INTRADC_delta = code;
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (DC_size > 8) BitstreamRead1Bits_INLINE(stream);
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Return nothing or data or data pointer
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
76