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); unsigned int pic_num; 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_AVAIL: { const Picture *my_picture = parser->GetNextPicture(); if (my_picture) { pic_num = parser->GetNextPicture()->GetPparams().PictureNum(); decoder->frame_num = pic_num; set_frame_data (parser, decoder); /* A full frame is only available if we're doing * progressive coding or have decoded the second field. * Will only return when a full frame is available */ if (!parser->GetDecoderParams().FieldCoding() || pic_num%2) { /* Frame number currently available for display */ decoder->frame_num = pic_num; if (parser->GetDecoderParams().FieldCoding()) decoder->frame_num = pic_num>>1; decoder->frame_avail = 1; return decoder->state; } } break; } case STATE_INVALID: return decoder->state; break; case STATE_SEQUENCE_END: return decoder->state; break; default: break; } }//try catch (const DiracException& e) { return STATE_INVALID; } } return decoder->state; }