2 #include <VP_Os/vp_os_print.h>
4 #include <ardrone_tool/Video/mjpeg_stage_decode.h>
6 uint32_t mjpeg_stage_num_picture_decoded = 0;
8 const vp_api_stage_funcs_t mjpeg_decoding_funcs = {
9 (vp_api_stage_handle_msg_t) NULL,
10 (vp_api_stage_open_t) mjpeg_stage_decoding_open,
11 (vp_api_stage_transform_t) mjpeg_stage_decoding_transform,
12 (vp_api_stage_close_t) mjpeg_stage_decoding_close
15 C_RESULT mjpeg_stage_decoding_open(mjpeg_stage_decoding_config_t *cfg)
17 stream_new( &cfg->stream, OUTPUT_STREAM );
19 return mjpeg_init( &cfg->mjpeg, MJPEG_DECODE, cfg->picture->width, cfg->picture->height, cfg->picture->format );
22 C_RESULT mjpeg_stage_decoding_transform(mjpeg_stage_decoding_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out)
26 vp_os_mutex_lock( &out->lock );
28 if(out->status == VP_API_STATUS_INIT)
31 out->buffers = (int8_t**) cfg->picture;
35 out->status = VP_API_STATUS_PROCESSING;
38 if( in->status == VP_API_STATUS_ENDED ) {
39 out->status = in->status;
42 // Several cases must be handled in this stage
43 // 1st: Input buffer is too small to decode a complete picture
44 // 2nd: Input buffer is big enough to decode 1 frame
45 // 3rd: Input buffer is so big we can decode more than 1 frame
47 if( out->status == VP_API_STATUS_PROCESSING )
49 // Reinit stream with new data
50 stream_config( &cfg->stream, in->size, in->buffers[in->indexBuffer] );
53 if(out->status == VP_API_STATUS_PROCESSING || out->status == VP_API_STATUS_STILL_RUNNING)
55 // If out->size == 1 it means picture is ready
57 out->status = VP_API_STATUS_PROCESSING;
59 mjpeg_decode( &cfg->mjpeg, cfg->picture, &cfg->stream, &got_image );
63 // we got one picture (handle case 1)
66 mjpeg_stage_num_picture_decoded = cfg->mjpeg.num_frames;
70 for(i = 0; i < cfg->picture->width * cfg->picture->height / 4; i++ )
72 cfg->picture->cr_buf[i] = 0x80;
73 cfg->picture->cb_buf[i] = 0x80;
78 if( FAILED(stream_is_empty( &cfg->stream )) )
80 // Some data are still in stream
81 // Next time we run this stage we don't want this data to be lost
83 out->status = VP_API_STATUS_STILL_RUNNING;
88 vp_os_mutex_unlock( &out->lock );
93 C_RESULT mjpeg_stage_decoding_close(mjpeg_stage_decoding_config_t *cfg)
95 stream_delete( &cfg->stream );
97 return mjpeg_release( &cfg->mjpeg );