X-Git-Url: http://git.maemo.org/git/?p=mardrone;a=blobdiff_plain;f=mardrone%2FARDrone_SDK_Version_1_8_20110726%2FARDroneLib%2FVLIB%2FStages%2Fvlib_stage_decode.c;fp=mardrone%2FARDrone_SDK_Version_1_8_20110726%2FARDroneLib%2FVLIB%2FStages%2Fvlib_stage_decode.c;h=0d11bf35251ca3bd12fbca0b5b4f1992611f83c5;hp=0000000000000000000000000000000000000000;hb=9ec9bc13b75d30bc45535c54a652934debfcea92;hpb=ae0a3c2dc0898400aca0dd6b439c5db8044db7b2 diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VLIB/Stages/vlib_stage_decode.c b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VLIB/Stages/vlib_stage_decode.c new file mode 100644 index 0000000..0d11bf3 --- /dev/null +++ b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VLIB/Stages/vlib_stage_decode.c @@ -0,0 +1,119 @@ +#include +#include +#include + + +#define FRAME_MODE_BUFFER_SIZE 256 + +static video_stream_t stream; + +const vp_api_stage_funcs_t vlib_decoding_funcs = { + (vp_api_stage_handle_msg_t) NULL, + (vp_api_stage_open_t) vlib_stage_decoding_open, + (vp_api_stage_transform_t) vlib_stage_decoding_transform, + (vp_api_stage_close_t) vlib_stage_decoding_close +}; + +C_RESULT vlib_stage_decoding_open(vlib_stage_decoding_config_t *cfg) +{ + // init video decoder with NULL_CODEC + video_codec_open( &cfg->controller, NULL_CODEC ); + + if(cfg->block_mode_enable) + { + vp_os_free( cfg->controller.in_stream.bytes ); + } + else + { + stream.bytes = (uint32_t*)vp_os_malloc(FRAME_MODE_BUFFER_SIZE*sizeof(uint32_t)); + stream.index = 0; + stream.used = 0; + stream.size = FRAME_MODE_BUFFER_SIZE*sizeof(uint32_t); + } + + cfg->num_picture_decoded = 0; + + return C_OK; +} + +C_RESULT vlib_stage_decoding_transform(vlib_stage_decoding_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out) +{ + bool_t got_image; + + vp_os_mutex_lock( &out->lock ); + + if(out->status == VP_API_STATUS_INIT) + { + out->numBuffers = 1; + out->buffers = (int8_t**)(int8_t*)cfg->picture; + out->indexBuffer = 0; + out->lineSize = 0; + + out->status = VP_API_STATUS_PROCESSING; + } + + if( in->status == VP_API_STATUS_ENDED ) { + out->status = in->status; + } + + if(out->status == VP_API_STATUS_PROCESSING ) + { + // If out->size == 1 it means picture is ready + out->size = 0; + + cfg->picture->vision_complete = 0; + cfg->picture->complete = 0; + cfg->picture->blockline = 0; + + got_image = FALSE; + + if(cfg->block_mode_enable) + { + cfg->controller.in_stream.bytes = (uint32_t*)in->buffers[0]; + cfg->controller.in_stream.used = in->size; + cfg->controller.in_stream.size = in->size; + cfg->controller.in_stream.index = 0; + cfg->controller.in_stream.length = 32; + cfg->controller.in_stream.code = 0; + + video_decode_blockline( &cfg->controller, cfg->picture, &got_image ); + } + else + { + stream.index = 0; + stream.used = in->size; + vp_os_memcpy(&stream.bytes[0], (uint32_t*)in->buffers[0], in->size); + + video_decode_picture( &cfg->controller, cfg->picture, &stream, &got_image ); + } + + if( got_image ) + { + // we got one picture + out->size = 1; + cfg->picture->complete = 1; + cfg->num_picture_decoded++; + + if( cfg->luma_only ) + { + int32_t i; + for(i = 0; i < (int32_t)cfg->picture->width * (int32_t)cfg->picture->height / 4; i++ ) + { + cfg->picture->cr_buf[i] = 0x80; + cfg->picture->cb_buf[i] = 0x80; + } + } + } + } + + vp_os_mutex_unlock( &out->lock ); + + return C_OK; +} + +C_RESULT vlib_stage_decoding_close(vlib_stage_decoding_config_t *cfg) +{ + if(!cfg->block_mode_enable) + vp_os_free(stream.bytes); + return video_codec_close( &cfg->controller ); +}