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