extern DllExport dirac_decoder_state_t dirac_parse (dirac_decoder_t *decoder) { TEST (decoder != NULL); TEST (decoder->parser != NULL); DiracParser *parser = static_cast<DiracParser *>(decoder->parser); while(true) { try { decoder->state = parser->Parse(); switch (decoder->state) { case STATE_BUFFER: return decoder->state; break; case STATE_SEQUENCE: set_sequence_params(parser, decoder); decoder->frame_avail = 0; return decoder->state; break; case STATE_PICTURE_START: /* frame params of the frame being decoded in coding order */ set_frame_params (parser->GetNextFrameParams(), decoder); decoder->frame_avail = 0; return decoder->state; break; case STATE_PICTURE_AVAIL: /* frame params of the frame available for display */ set_frame_params (parser->GetNextFrame().GetFparams(), decoder); set_frame_data (parser, decoder); if (!parser->GetDecoderParams().FieldCoding() || decoder->frame_params.fnum%2) { decoder->frame_avail = 1; return decoder->state; } break; case STATE_INVALID: return decoder->state; break; default: break; } }//try catch (const DiracException& e) { return STATE_INVALID; } } return decoder->state; }
extern DllExport dirac_decoder_state_t dirac_parse (dirac_decoder_t *decoder) { TEST (decoder != NULL); TEST (decoder->parser != NULL); DiracParser *parser = static_cast<DiracParser *>(decoder->parser); decoder->state = parser->Parse(); switch (decoder->state) { case STATE_BUFFER: break; case STATE_SEQUENCE: set_sequence_params(parser, decoder); decoder->frame_avail = 0; break; case STATE_PICTURE_START: /* frame params of the frame being decoded in coding order */ set_frame_params (parser->GetNextFrameParams(), decoder); decoder->frame_avail = 0; break; case STATE_PICTURE_AVAIL: decoder->frame_avail = 1; /* frame params of the frame available for display */ set_frame_params (parser->GetNextFrame().GetFparams(), decoder); set_frame_data (parser, decoder); break; case STATE_INVALID: break; default: break; } return decoder->state; }