ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VLIB / Stages / vlib_stage_encode.c
1 /**
2  *  \brief    vlib Stage
3  *  \author   Sylvain Gaeremynck <sylvain.gaeremynck@parrot.fr>
4  *  \version  1.0
5  *  \date     first release 06/12/2007
6  */
7 #include <VP_Os/vp_os_malloc.h>
8 #include <VP_Os/vp_os_print.h>
9
10 #include <VLIB/Stages/vlib_stage_encode.h>
11 #include <VLIB/video_packetizer.h>
12
13 ///*******************************************************************************************************************///
14
15 const vp_api_stage_funcs_t vlib_encoding_funcs = {
16   (vp_api_stage_handle_msg_t) NULL,
17   (vp_api_stage_open_t) vlib_stage_encoding_open,
18   (vp_api_stage_transform_t) vlib_stage_encoding_transform,
19   (vp_api_stage_close_t) vlib_stage_encoding_close
20 };
21
22 ///*******************************************************************************************************************///
23
24 C_RESULT vlib_stage_encoding_open(vlib_stage_encoding_config_t *cfg)
25 {
26   video_codec_open( &cfg->controller, cfg->codec_type );
27   video_controller_set_mode( &cfg->controller, VIDEO_ENCODE );
28   video_controller_set_format( &cfg->controller, cfg->width, cfg->height );
29   video_controller_set_motion_estimation( &cfg->controller, FALSE );
30   video_controller_set_target_size( &cfg->controller, cfg->target_size );
31   return C_OK;
32 }
33
34 C_RESULT vlib_stage_encoding_transform(vlib_stage_encoding_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out)
35 {
36   static int32_t local_subsampl = 0;
37
38   vp_os_mutex_lock(&out->lock);
39
40   if( out->status == VP_API_STATUS_INIT )
41   {
42     out->numBuffers   = 1;
43     out->buffers      = (int8_t**)(int8_t*)&cfg->controller.in_stream.bytes;
44     out->indexBuffer  = 0;
45
46     out->status = VP_API_STATUS_PROCESSING;
47
48     cfg->current_size = 0;
49   }
50
51   if( local_subsampl == 0 && out->status == VP_API_STATUS_PROCESSING )
52   {
53     // check video_codec didn't change
54     if (cfg->controller.codec_type != cfg->codec_type)
55     {
56       video_codec_open( &cfg->controller, cfg->codec_type );
57       video_controller_set_mode( &cfg->controller, VIDEO_ENCODE );
58       video_controller_set_format( &cfg->controller, cfg->width, cfg->height );
59       video_controller_set_motion_estimation( &cfg->controller, FALSE );
60     }
61
62     // update target size
63     video_controller_set_target_size( &cfg->controller, cfg->target_size );
64     RTMON_USTART(VIDEO_VLIB_ENCODE_EVENT);
65     if(cfg->block_mode_enable)
66       video_encode_blockline( &cfg->controller, cfg->picture, cfg->picture->complete );
67     else
68       video_encode_picture( &cfg->controller, cfg->picture, (bool_t*)&cfg->picture->complete );
69     RTMON_USTOP(VIDEO_VLIB_ENCODE_EVENT);
70
71     if(cfg->picture->complete)
72     {
73       RTMON_UVAL(ENCODED_PICTURE_UVAL, cfg->controller.num_frames);
74       local_subsampl++;
75     }
76
77     cfg->current_size = cfg->controller.in_stream.used;
78
79     if( cfg->controller.in_stream.length != 32 )
80     {
81       // flush & reset internal stream
82       video_write_data( &cfg->controller.in_stream, 0, cfg->controller.in_stream.length+1 );
83       cfg->controller.in_stream.length = 32;
84     }
85     out->size = cfg->controller.in_stream.used;
86
87     RTMON_UVAL(ENCODED_BLOCKLINE_SIZE_UVAL, out->size);
88
89     cfg->controller.in_stream.used  = 0;
90     cfg->controller.in_stream.index = 0;
91   }
92   else
93   {
94     out->size = 0;
95
96     if( cfg->picture->complete )
97     {
98       local_subsampl++;
99     }
100   }
101
102   if(local_subsampl >= (int32_t)cfg->subsampl)
103     local_subsampl = 0;
104   vp_os_mutex_unlock( &out->lock );
105
106   return C_OK;
107 }
108
109 C_RESULT vlib_stage_encoding_close(vlib_stage_encoding_config_t *cfg)
110 {
111   return video_codec_close( &cfg->controller );
112 }
113
114
115 ///*******************************************************************************************************************///