1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_debug.h"    // For DEB
2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_parser_ops.h"  // For parser helper functions
3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "vc1.h"                // For the parser structure
4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "vc1parse.h"           // For vc1 parser helper functions
5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_pm.h"
7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define vc1_is_frame_start_code( ch )                                   \
9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    (( vc1_SCField == ch ||vc1_SCSlice == ch || vc1_SCFrameHeader == ch ) ? 1 : 0)
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* init function */
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_vc1_init(void *ctxt, uint32_t *persist_mem, uint32_t preserve)
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_vc1_init(void *ctxt, uint32_t *persist_mem, uint32_t preserve)
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    vc1_viddec_parser_t *parser = ctxt;
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int i;
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    persist_mem = persist_mem;
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    for(i=0; i<VC1_NUM_REFERENCE_FRAMES; i++)
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->ref_frame[i].id   = -1; /* first I frame checks that value */
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->ref_frame[i].anchor[0] = 1;
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->ref_frame[i].anchor[1] = 1;
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->ref_frame[i].intcomp_top = 0;
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->ref_frame[i].intcomp_bot = 0;
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->intcomp_top[0] = 0;
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->intcomp_bot[0] = 0;
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->intcomp_top[1] = 0;
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->intcomp_bot[1] = 0;
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->is_reference_picture = false;
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    memset(&parser->info.picLayerHeader, 0, sizeof(vc1_PictureLayerHeader));
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(preserve)
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->sc_seen &= VC1_EP_MASK;
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->sc_seen_since_last_wkld &= VC1_EP_MASK;
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->sc_seen = VC1_SC_INVALID;
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->sc_seen_since_last_wkld = VC1_SC_INVALID;
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        memset(&parser->info.metadata, 0, sizeof(parser->info.metadata));
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} // viddec_vc1_init
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void vc1_swap_intcomp(vc1_viddec_parser_t *parser)
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->intcomp_top[1] = parser->intcomp_top[0];
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->intcomp_bot[1] = parser->intcomp_bot[0];
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->intcomp_top[0] = 0;
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->intcomp_bot[0] = 0;
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} // vc1_swap_intcomp
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t viddec_vc1_parse(void *parent, void *ctxt)
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic uint32_t viddec_vc1_parse(void *parent, void *ctxt)
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    vc1_viddec_parser_t *parser = ctxt;
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t sc=0x0;
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int32_t ret=0, status=0;
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* This works only if there is one slice and no start codes */
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* A better fix would be to insert start codes it there aren't any. */
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = viddec_pm_peek_bits(parent, &sc, 32);
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if ((sc > 0x0100) && (sc < 0x0200)) /* a Start code will be in this range. */
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      ret = viddec_pm_get_bits(parent, &sc, 32);
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      /* In cases where we get a buffer with no start codes, we assume */
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      /* that this is a frame of data. We may have to fix this later. */
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      sc = vc1_SCFrameHeader;
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = viddec_pm_get_bits(parent, &sc, 32);
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    sc = sc & 0xFF;
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->is_frame_start = (sc == vc1_SCFrameHeader);
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    DEB("START_CODE = %02x\n", sc);
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    switch( sc )
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCSequenceHeader:
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            uint32_t data=0;
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->ref_frame[0].anchor[0] = 1;
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->ref_frame[0].anchor[1] = 1;
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->ref_frame[1].anchor[0] = 1;
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->ref_frame[1].anchor[1] = 1;
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            memset( &parser->info.metadata, 0, sizeof(parser->info.metadata));
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            /* look if we have a rcv header for main or simple profile */
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = viddec_pm_peek_bits(parent,&data ,2);
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (data == 3)
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                status = vc1_ParseSequenceLayer(parent, &parser->info);
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            else
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                status = vc1_ParseRCVSequenceLayer(parent, &parser->info);
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen = VC1_SC_SEQ;
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen_since_last_wkld |= VC1_SC_SEQ;
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->start_code = VC1_SC_SEQ;
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCEntryPointHeader:
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            status = vc1_ParseEntryPointLayer(parent, &parser->info);
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen |= VC1_SC_EP;
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            // Clear all bits indicating data below ep header
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen &= VC1_EP_MASK;
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen_since_last_wkld |= VC1_SC_EP;
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->start_code = VC1_SC_EP;
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCFrameHeader:
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            memset(&parser->info.picLayerHeader, 0, sizeof(vc1_PictureLayerHeader));
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            status = vc1_ParsePictureLayer(parent, &parser->info);
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if((parser->info.picLayerHeader.PTypeField1 == VC1_I_FRAME) ||
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee               (parser->info.picLayerHeader.PTypeField1 == VC1_P_FRAME) ||
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee               (parser->info.picLayerHeader.PTYPE == VC1_I_FRAME) ||
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee               (parser->info.picLayerHeader.PTYPE == VC1_P_FRAME))
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                vc1_swap_intcomp(parser);
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen |= VC1_SC_FRM;
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            // Clear all bits indicating data below frm header
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen &= VC1_FRM_MASK;
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen_since_last_wkld |= VC1_SC_FRM;
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            vc1_start_new_frame ( parent, parser );
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->start_code = VC1_SC_FRM;
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCSlice:
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            status = vc1_ParseSliceLayer(parent, &parser->info);
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen_since_last_wkld |= VC1_SC_SLC;
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         	parser->start_code = VC1_SC_SLC;
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCField:
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.SLICE_ADDR = 0;
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.CurrField = 1;
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.REFFIELD = 0;
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.NUMREF = 0;
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.MBMODETAB = 0;
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.MV4SWITCH = 0;
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.DMVRANGE = 0;
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.MVTAB = 0;
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.MVMODE = 0;
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->info.picLayerHeader.MVRANGE = 0;
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->info.picLayerHeader.raw_MVTYPEMB = 0;
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->info.picLayerHeader.raw_DIRECTMB = 0;
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->info.picLayerHeader.raw_SKIPMB = 0;
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->info.picLayerHeader.raw_ACPRED = 0;
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->info.picLayerHeader.raw_FIELDTX = 0;
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->info.picLayerHeader.raw_OVERFLAGS = 0;
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->info.picLayerHeader.raw_FORWARDMB = 0;
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			memset(&(parser->info.picLayerHeader.MVTYPEMB), 0, sizeof(vc1_Bitplane));
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			memset(&(parser->info.picLayerHeader.DIRECTMB), 0, sizeof(vc1_Bitplane));
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			memset(&(parser->info.picLayerHeader.SKIPMB), 0, sizeof(vc1_Bitplane));
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			memset(&(parser->info.picLayerHeader.ACPRED), 0, sizeof(vc1_Bitplane));
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			memset(&(parser->info.picLayerHeader.FIELDTX), 0, sizeof(vc1_Bitplane));
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			memset(&(parser->info.picLayerHeader.OVERFLAGS), 0, sizeof(vc1_Bitplane));
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			memset(&(parser->info.picLayerHeader.FORWARDMB), 0, sizeof(vc1_Bitplane));
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->info.picLayerHeader.ALTPQUANT = 0;
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->info.picLayerHeader.DQDBEDGE = 0;
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee #endif
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            status = vc1_ParseFieldLayer(parent, &parser->info);
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if((parser->info.picLayerHeader.PTypeField2 == VC1_I_FRAME) ||
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee               (parser->info.picLayerHeader.PTypeField2 == VC1_P_FRAME))
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                vc1_swap_intcomp(parser);
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen |= VC1_SC_FLD;
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen_since_last_wkld |= VC1_SC_FLD;
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			parser->start_code = VC1_SC_FLD;
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCSequenceUser:
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCEntryPointUser:
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCFrameUser:
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCSliceUser:
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCFieldUser:
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {/* Handle user data */
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            status = vc1_ParseAndAppendUserData(parent, sc); //parse and add items
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen_since_last_wkld |= VC1_SC_UD;
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->start_code = VC1_SC_UD;
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCEndOfSequence:
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen = VC1_SC_INVALID;
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen_since_last_wkld |= VC1_SC_INVALID;
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->start_code = VC1_SC_INVALID;
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        default: /* Any other SC that is not handled */
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            DEB("SC = %02x - unhandled\n", sc );
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->start_code = VC1_SC_INVALID;
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if( vc1_is_frame_start_code( sc ) ) {
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        vc1_parse_emit_current_frame( parent, parser );
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return VIDDEC_PARSE_SUCESS;
255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} // viddec_vc1_parse
256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   If a picture header was seen and the next start code is a sequence header, entrypoint header,
259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   end of sequence or another frame header, this api returns frame done.
260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   If a sequence header and a frame header was not seen before this point, all the
261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   information needed for decode is not present and parser errors are reported.
262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee*/
263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
264bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t viddec_vc1_wkld_done(void *parent, void *ctxt, unsigned int next_sc, uint32_t *codec_specific_errors)
265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
266bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic uint32_t viddec_vc1_wkld_done(void *parent, void *ctxt, unsigned int next_sc, uint32_t *codec_specific_errors)
267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    vc1_viddec_parser_t *parser = ctxt;
270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int ret = VIDDEC_PARSE_SUCESS;
271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parent = parent;
272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    switch (next_sc)
273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCFrameHeader:
275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if(((parser->sc_seen_since_last_wkld & VC1_SC_EP) ||
276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (parser->sc_seen_since_last_wkld & VC1_SC_SEQ)) &&
277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee               (!(parser->sc_seen_since_last_wkld & VC1_SC_FRM)))
278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            // Deliberate fall-thru case
282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCEntryPointHeader:
283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if((next_sc == vc1_SCEntryPointHeader) &&
284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee               (parser->sc_seen_since_last_wkld & VC1_SC_SEQ) &&
285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee               (!(parser->sc_seen_since_last_wkld & VC1_SC_EP)))
286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            // Deliberate fall-thru case
290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCSequenceHeader:
291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case vc1_SCEndOfSequence:
292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case VIDDEC_PARSE_EOS:
293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        case VIDDEC_PARSE_DISCONTINUITY:
294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = VIDDEC_PARSE_FRMDONE;
295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            // Set errors for progressive
296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if((parser->sc_seen & VC1_SC_SEQ) && (parser->sc_seen & VC1_SC_FRM))
297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                *codec_specific_errors = 0;
298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            else
299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                *codec_specific_errors |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE;
300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            vc1_end_frame(parser);
301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->sc_seen_since_last_wkld = VC1_SC_INVALID;
302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            // TODO: Need to check for interlaced
303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;
304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        default:
305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = VIDDEC_PARSE_SUCESS;
306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;
307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    } //switch
308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    DEB("sc: 0x%x, sc_seen: 0x%x, sc_since_last_wkld:%d, error:%d, ret: %d\n",
309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        next_sc, parser->sc_seen, parser->sc_seen_since_last_wkld,
310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        *codec_specific_errors, ret);
311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return ret;
313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} // viddec_vc1_wkld_done
314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
316bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_vc1_get_context_size(viddec_parser_memory_sizes_t *size)
317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
318bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_vc1_get_context_size(viddec_parser_memory_sizes_t *size)
319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    size->context_size = sizeof(vc1_viddec_parser_t);
322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    size->persist_size = 0;
323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} // viddec_vc1_get_context_size
325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
327bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t viddec_vc1_is_start_frame(void *ctxt)
328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
329bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic uint32_t viddec_vc1_is_start_frame(void *ctxt)
330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    vc1_viddec_parser_t *parser = (vc1_viddec_parser_t *) ctxt;
333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return parser->is_frame_start;
334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} // viddec_vc1_is_start_frame
335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
336bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_vc1_get_ops(viddec_parser_ops_t *ops)
337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ops->init = viddec_vc1_init;
339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ops->parse_syntax = viddec_vc1_parse;
340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ops->get_cxt_size = viddec_vc1_get_context_size;
341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ops->is_wkld_done = viddec_vc1_wkld_done;
342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ops->is_frame_start = viddec_vc1_is_start_frame;
343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} // viddec_vc1_get_ops
345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
346