3 * \author Sylvain Gaeremynck <sylvain.gaeremynck@parrot.fr>
5 * \date first release 06/12/2007
7 #include <VP_Os/vp_os_malloc.h>
8 #include <VP_Os/vp_os_print.h>
10 #include <VLIB/Stages/vlib_stage_encode.h>
11 #include <VLIB/video_packetizer.h>
13 ///*******************************************************************************************************************///
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
22 ///*******************************************************************************************************************///
24 C_RESULT vlib_stage_encoding_open(vlib_stage_encoding_config_t *cfg)
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 );
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)
36 static int32_t local_subsampl = 0;
38 vp_os_mutex_lock(&out->lock);
40 if( out->status == VP_API_STATUS_INIT )
43 out->buffers = (int8_t**)(int8_t*)&cfg->controller.in_stream.bytes;
46 out->status = VP_API_STATUS_PROCESSING;
48 cfg->current_size = 0;
51 if( local_subsampl == 0 && out->status == VP_API_STATUS_PROCESSING )
53 // check video_codec didn't change
54 if (cfg->controller.codec_type != cfg->codec_type)
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 );
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 );
68 video_encode_picture( &cfg->controller, cfg->picture, (bool_t*)&cfg->picture->complete );
69 RTMON_USTOP(VIDEO_VLIB_ENCODE_EVENT);
71 if(cfg->picture->complete)
73 RTMON_UVAL(ENCODED_PICTURE_UVAL, cfg->controller.num_frames);
77 cfg->current_size = cfg->controller.in_stream.used;
79 if( cfg->controller.in_stream.length != 32 )
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;
85 out->size = cfg->controller.in_stream.used;
87 RTMON_UVAL(ENCODED_BLOCKLINE_SIZE_UVAL, out->size);
89 cfg->controller.in_stream.used = 0;
90 cfg->controller.in_stream.index = 0;
96 if( cfg->picture->complete )
102 if(local_subsampl >= (int32_t)cfg->subsampl)
104 vp_os_mutex_unlock( &out->lock );
109 C_RESULT vlib_stage_encoding_close(vlib_stage_encoding_config_t *cfg)
111 return video_codec_close( &cfg->controller );
115 ///*******************************************************************************************************************///