def _create_encoder(self, quality=85, thumbnail=(64, 48, 35), bayer=False): super(PiImageEncoder, self)._create_encoder() try: self.output_port[0].format[0].encoding = { 'jpeg': mmal.MMAL_ENCODING_JPEG, 'png': mmal.MMAL_ENCODING_PNG, 'gif': mmal.MMAL_ENCODING_GIF, 'bmp': mmal.MMAL_ENCODING_BMP, }[self.format] except KeyError: raise PiCameraValueError("Unrecognized format %s" % self.format) mmal_check( mmal.mmal_port_format_commit(self.output_port), prefix="Unable to set format on encoder output port") if self.format == 'jpeg': mmal_check( mmal.mmal_port_parameter_set_uint32( self.output_port, mmal.MMAL_PARAMETER_JPEG_Q_FACTOR, quality), prefix="Failed to set JPEG quality") mmal_check( mmal.mmal_port_parameter_set_boolean( self.camera_port, mmal.MMAL_PARAMETER_ENABLE_RAW_CAPTURE, int(bool(bayer))), prefix="Failed to set raw capture") if thumbnail is None: mp = mmal.MMAL_PARAMETER_THUMBNAIL_CONFIG_T( mmal.MMAL_PARAMETER_HEADER_T( mmal.MMAL_PARAMETER_THUMBNAIL_CONFIGURATION, ct.sizeof(mmal.MMAL_PARAMETER_THUMBNAIL_CONFIG_T) ), 0, 0, 0, 0) else: mp = mmal.MMAL_PARAMETER_THUMBNAIL_CONFIG_T( mmal.MMAL_PARAMETER_HEADER_T( mmal.MMAL_PARAMETER_THUMBNAIL_CONFIGURATION, ct.sizeof(mmal.MMAL_PARAMETER_THUMBNAIL_CONFIG_T) ), 1, *thumbnail) mmal_check( mmal.mmal_port_parameter_set(self.encoder[0].control, mp.hdr), prefix="Failed to set thumbnail configuration") mmal_check( mmal.mmal_component_enable(self.encoder), prefix="Unable to enable encoder component")
def _get_fullscreen(self): mp = mmal.MMAL_DISPLAYREGION_T( mmal.MMAL_PARAMETER_HEADER_T(mmal.MMAL_PARAMETER_DISPLAYREGION, ct.sizeof(mmal.MMAL_DISPLAYREGION_T))) mmal_check(mmal.mmal_port_parameter_get(self.renderer[0].input[0], mp.hdr), prefix="Failed to get fullscreen") return mp.fullscreen != mmal.MMAL_FALSE
def _set_fullscreen(self, value): mp = mmal.MMAL_DISPLAYREGION_T(mmal.MMAL_PARAMETER_HEADER_T( mmal.MMAL_PARAMETER_DISPLAYREGION, ct.sizeof(mmal.MMAL_DISPLAYREGION_T)), set=mmal.MMAL_DISPLAY_SET_FULLSCREEN, fullscreen=bool(value)) mmal_check(mmal.mmal_port_parameter_set(self.renderer[0].input[0], mp.hdr), prefix="Failed to set fullscreen")
def _set_transform(self, value): mp = mmal.MMAL_DISPLAYREGION_T( mmal.MMAL_PARAMETER_HEADER_T(mmal.MMAL_PARAMETER_DISPLAYREGION, ct.sizeof(mmal.MMAL_DISPLAYREGION_T)), set=mmal.MMAL_DISPLAY_SET_TRANSFORM, transform=value, ) mmal_check(mmal.mmal_port_parameter_set(self.renderer[0].input[0], mp.hdr), prefix="Failed to set transform")
def _get_crop(self): mp = mmal.MMAL_DISPLAYREGION_T( mmal.MMAL_PARAMETER_HEADER_T(mmal.MMAL_PARAMETER_DISPLAYREGION, ct.sizeof(mmal.MMAL_DISPLAYREGION_T))) mmal_check(mmal.mmal_port_parameter_get(self.renderer[0].input[0], mp.hdr), prefix="Failed to get crop") return ( mp.src_rect.x, mp.src_rect.y, mp.src_rect.width, mp.src_rect.height, )
def _set_crop(self, value): try: x, y, w, h = value except (TypeError, ValueError) as e: raise PiCameraValueError( "Invalid crop rectangle (x, y, w, h) tuple: %s" % value) mp = mmal.MMAL_DISPLAYREGION_T( mmal.MMAL_PARAMETER_HEADER_T(mmal.MMAL_PARAMETER_DISPLAYREGION, ct.sizeof(mmal.MMAL_DISPLAYREGION_T)), set=mmal.MMAL_DISPLAY_SET_SRC_RECT, src_rect=mmal.MMAL_RECT_T(x, y, w, h), ) mmal_check(mmal.mmal_port_parameter_set(self.renderer[0].input[0], mp.hdr), prefix="Failed to set crop")
def _set_layer(self, value): try: if not (0 <= value <= 255): raise PiCameraValueError( "Invalid layer value: %d (valid range 0..255)" % value) except TypeError: raise PiCameraValueError("Invalid layer value: %s" % value) mp = mmal.MMAL_DISPLAYREGION_T(mmal.MMAL_PARAMETER_HEADER_T( mmal.MMAL_PARAMETER_DISPLAYREGION, ct.sizeof(mmal.MMAL_DISPLAYREGION_T)), set=mmal.MMAL_DISPLAY_SET_LAYER, layer=value) mmal_check(mmal.mmal_port_parameter_set(self.renderer[0].input[0], mp.hdr), prefix="Failed to set layer")
def _create_encoder(self, bitrate=17000000, intra_period=0, profile='high', quantization=0, inline_headers=True, sei=False): super(PiVideoEncoder, self)._create_encoder() try: self.output_port[0].format[0].encoding = { 'h264': mmal.MMAL_ENCODING_H264, 'mjpeg': mmal.MMAL_ENCODING_MJPEG, }[self.format] except KeyError: raise PiCameraValueError('Unrecognized format %s' % self.format) if not (0 <= bitrate <= 25000000): raise PiCameraValueError( 'bitrate must be between 0 (VBR) and 25Mbps') if quantization and bitrate: warnings.warn('Setting bitrate to 0 as quantization is non-zero', PiCameraWarning) bitrate = 0 self.output_port[0].format[0].bitrate = bitrate mmal_check(mmal.mmal_port_format_commit(self.output_port), prefix="Unable to set format on encoder output port") if self.format == 'h264': mp = mmal.MMAL_PARAMETER_VIDEO_PROFILE_T( mmal.MMAL_PARAMETER_HEADER_T( mmal.MMAL_PARAMETER_PROFILE, ct.sizeof(mmal.MMAL_PARAMETER_VIDEO_PROFILE_T), ), ) try: mp.profile[0].profile = { 'baseline': mmal.MMAL_VIDEO_PROFILE_H264_BASELINE, 'main': mmal.MMAL_VIDEO_PROFILE_H264_MAIN, 'high': mmal.MMAL_VIDEO_PROFILE_H264_HIGH, 'constrained': mmal.MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE, }[profile] except KeyError: raise PiCameraValueError("Invalid H.264 profile %s" % profile) mp.profile[0].level = mmal.MMAL_VIDEO_LEVEL_H264_4 mmal_check(mmal.mmal_port_parameter_set(self.output_port, mp.hdr), prefix="Unable to set encoder H.264 profile") mmal_check(mmal.mmal_port_parameter_set_boolean( self.output_port, mmal.MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER, int(inline_headers)), prefix="Unable to set inline_headers") mmal_check(mmal.mmal_port_parameter_set_boolean( self.output_port, mmal.MMAL_PARAMETER_VIDEO_ENCODE_SEI_ENABLE, int(sei)), prefix="Enable to set SEI") if not (bitrate and inline_headers): # If inline_headers is disabled, or VBR encoding is configured, # disable the split function self._next_output = None if intra_period: mp = mmal.MMAL_PARAMETER_UINT32_T( mmal.MMAL_PARAMETER_HEADER_T( mmal.MMAL_PARAMETER_INTRAPERIOD, ct.sizeof(mmal.MMAL_PARAMETER_UINT32_T), ), intra_period) mmal_check(mmal.mmal_port_parameter_set( self.output_port, mp.hdr), prefix="Unable to set encoder intra_period") if quantization: mp = mmal.MMAL_PARAMETER_UINT32_T( mmal.MMAL_PARAMETER_HEADER_T( mmal.MMAL_PARAMETER_VIDEO_ENCODE_INITIAL_QUANT, ct.sizeof(mmal.MMAL_PARAMETER_UINT32_T), ), quantization) mmal_check(mmal.mmal_port_parameter_set(self.output_port, mp.hdr), prefix="Unable to set initial quantization") mp = mmal.MMAL_PARAMETER_UINT32_T( mmal.MMAL_PARAMETER_HEADER_T( mmal.MMAL_PARAMETER_VIDEO_ENCODE_MIN_QUANT, ct.sizeof(mmal.MMAL_PARAMETER_UINT32_T), ), quantization, ) mmal_check(mmal.mmal_port_parameter_set(self.output_port, mp.hdr), prefix="Unable to set minimum quantization") mp = mmal.MMAL_PARAMETER_UINT32_T( mmal.MMAL_PARAMETER_HEADER_T( mmal.MMAL_PARAMETER_VIDEO_ENCODE_MAX_QUANT, ct.sizeof(mmal.MMAL_PARAMETER_UINT32_T), ), quantization, ) mmal_check(mmal.mmal_port_parameter_set(self.output_port, mp.hdr), prefix="Unable to set maximum quantization") mmal_check(mmal.mmal_port_parameter_set_boolean( self.encoder[0].input[0], mmal.MMAL_PARAMETER_VIDEO_IMMUTABLE_INPUT, 1), prefix="Unable to set immutable flag on encoder input port") mmal_check(mmal.mmal_component_enable(self.encoder), prefix="Unable to enable video encoder component")
sc.max_stills_h = h sc.stills_yuv422 = 0 sc.one_shot_stills = 0 sc.max_preview_video_w = w sc.max_preview_video_h = h sc.num_preview_video_frames = 3 sc.stills_capture_circular_buffer_height = 0 sc.fast_preview_resume = 0 camera.control.params[mmal.MMAL_PARAMETER_CAMERA_CONFIG] = sc #fps=camera.control.params[mmal.MMAL_PARAMETER_FPS_RANGE] #fps.fps_low.num=2 #fps.fps_low.den=1 #fps.fps_high.num=2 #fps.fps_high.den=1 fps = mmal.MMAL_PARAMETER_FPS_RANGE_T( mmal.MMAL_PARAMETER_HEADER_T(mmal.MMAL_PARAMETER_FPS_RANGE, ct.sizeof(mmal.MMAL_PARAMETER_FPS_RANGE_T)), fps_low=mo.to_rational(2), fps_high=mo.to_rational(2), ) video_port.params[mmal.MMAL_PARAMETER_FPS_RANGE] = fps em = camera.control.params[mmal.MMAL_PARAMETER_EXPOSURE_MODE] em.value = mmal.MMAL_PARAM_EXPOSUREMODE_NIGHT camera.control.params[mmal.MMAL_PARAMETER_EXPOSURE_MODE] = em #video_port.params[mmal.MMAL_PARAMETER_MIRROR]=mmal.MMAL_PARAM_MIRROR_BOTH camera.control.params[mmal.MMAL_PARAMETER_EXPOSURE_COMP] = 18 video_port.enable(image_callback) camera.control.params[mmal.MMAL_PARAMETER_ANALOG_GAIN] = 12 print(video_port)