def _create_main_pipeline(self, device, size, fps, sync): self.pipeline = Gst.Pipeline() self.source = Gst.ElementFactory.make('v4l2src', 'source') self.source.set_property('device', device) self.source.set_property('do-timestamp', 'true') # run 'v4l2-ctl --list-ctrls' for full list of controls struct, _ = Gst.structure_from_string('name,\ white_balance_temperature_auto=(bool){0},\ backlight_compensation=(int){0},\ exposure_auto=0,\ focus_auto=(bool){0}') self.source.set_property('extra-controls', struct) caps = Gst.caps_from_string( 'video/x-raw,format=(string){BGR},width=%d,height=%d,framerate=%d/1' % (size[1], size[0], fps)) self.sink = Gst.ElementFactory.make('appsink', 'sink') self.sink.set_property('emit-signals', True) self.sink.set_property('sync', sync) self.sink.set_property('drop', True) self.sink.set_property('max-buffers', 1) self.sink.set_property('caps', caps) self.sink.emit('pull-preroll') self.pipeline.add(self.source) self.pipeline.add(self.sink) Gst.Element.link(self.source, self.sink)
def buffer_probe(pad, buffer, unused_user_data): # this comes from another thread caps = pad.query_caps(None).to_string() kaps = Gst.structure_from_string(caps) in_rate = 44100 # kaps[0].get_value('rate') # now do necessary filtercaps self.rate = in_rate if self.bitrate > -1: maxsamplerate = get_max_sample_rate(self.bitrate, self.channels) if in_rate > maxsamplerate: self.rate = get_preferred_sample_rate(maxsamplerate) self.debug( "rate %d > max rate %d (for %d kbit/sec), " "selecting rate %d instead" % (in_rate, maxsamplerate, self.bitrate, self.rate) ) caps_str = "audio/x-raw, rate=%d, channels=%d" % (self.rate, self.channels) cf.set_property("caps", Gst.caps_from_string(caps_str)) pad.remove_probe(handle) return True
def get_pipeline_string(self, properties): capsString = properties.get('format', 'video/x-raw') if capsString == 'video/x-raw': capsString = '%s,format=(string)I420' % capsString # Filtered caps struct = Gst.structure_from_string(capsString)[0] for k in 'width', 'height': if k in properties: struct.set_value(k, properties[k]) if 'framerate' in properties: framerate = properties['framerate'] struct.set_value('framerate', Gst.Fraction(framerate[0]/framerate[1])) # always set par struct.set_value('pixel-aspect-ratio', Gst.Fraction(1/1)) if 'pixel-aspect-ratio' in properties: par = properties['pixel-aspect-ratio'] struct.set_value('pixel-aspect-ratio', Gst.Fraction(par[0]/par[1])) # If RGB, set something ffmpegcolorspace can convert. if capsString == 'video/x-raw-rgb': struct.set_value('red_mask', 0xff00) caps = Gst.Caps.from_string(struct.to_string()) is_live = 'is-live=true' overlay = "" overlayTimestamps = properties.get('overlay-timestamps', False) if overlayTimestamps: overlay = " timeoverlay ! " return "videotestsrc %s name=source ! " % is_live + overlay + \ "identity name=identity silent=TRUE ! %s" % caps