Example #1
0
bool GstVideoCodec::start() {
  hide();
  if (0 == quid_->pmanage<MPtr(&PContainer::get<Selection<>::index_t>)>(codec_id_)) return true;
  shmsink_sub_ = std::make_unique<GstShmdataSubscriber>(
      shm_encoded_.get_raw(),
      [this](const std::string& caps) {
        this->quid_->graft_tree(
            ".shmdata.writer." + shm_encoded_path_,
            ShmdataUtils::make_tree(caps, ShmdataUtils::get_category(caps), ShmdataStat()));
      },
      ShmdataStat::make_tree_updater(quid_, ".shmdata.writer." + shm_encoded_path_));
  shmsrc_sub_ = std::make_unique<GstShmdataSubscriber>(
      shmsrc_.get_raw(),
      [this](const std::string& caps) {
        this->quid_->graft_tree(
            ".shmdata.reader." + shmpath_to_encode_,
            ShmdataUtils::make_tree(caps, ShmdataUtils::get_category(caps), ShmdataStat()));
      },
      ShmdataStat::make_tree_updater(quid_, ".shmdata.reader." + shmpath_to_encode_));
  make_bin();

  g_object_set(G_OBJECT(gst_pipeline_->get_pipeline()), "async-handling", TRUE, nullptr);
  if (copy_buffers_) g_object_set(G_OBJECT(shmsrc_.get_raw()), "copy-buffers", TRUE, nullptr);
  gst_pipeline_->play(true);
  return true;
}
Example #2
0
bool PulseSink::on_shmdata_connect(const std::string& shmpath) {
  pmanage<MPtr(&PContainer::disable)>(devices_enum_id_, ShmdataConnector::disabledWhenConnectedMsg);
  shmpath_ = shmpath;
  g_object_set(G_OBJECT(shmsrc_.get_raw()), "socket-path", shmpath_.c_str(), nullptr);
  if (!devices_.empty())
    g_object_set(G_OBJECT(pulsesink_.get_raw()),
                 "device",
                 devices_.at(devices_enum_.get()).name_.c_str(),
                 nullptr);
  shm_sub_ = std::make_unique<GstShmdataSubscriber>(
      shmsrc_.get_raw(),
      [this](const std::string& caps) {
        this->graft_tree(
            ".shmdata.reader." + shmpath_,
            ShmdataUtils::make_tree(caps, ShmdataUtils::get_category(caps), ShmdataStat()));
      },
      ShmdataStat::make_tree_updater(this, ".shmdata.reader." + shmpath_));

  gst_bin_add_many(GST_BIN(gst_pipeline_->get_pipeline()),
                   shmsrc_.get_raw(),
                   audioconvert_.get_raw(),
                   pulsesink_.get_raw(),
                   nullptr);
  gst_element_link_many(shmsrc_.get_raw(), audioconvert_.get_raw(), pulsesink_.get_raw(), nullptr);
  gst_pipeline_->play(true);
  return true;
}
Example #3
0
void ShmdataFollower::on_server_connected(const std::string& data_type) {
  if (data_type != data_type_) {
    data_type_ = data_type;
    quid_->graft_tree(
        tree_path_ + shmpath_,
        ShmdataUtils::make_tree(data_type_, ShmdataUtils::get_category(data_type_), ShmdataStat()));
  }
  if (osc_) osc_(data_type);
}
Example #4
0
bool PulseSrc::start() {
  g_object_set(G_OBJECT(pulsesrc_.get_raw()),
               "device",
               capture_devices_.at(devices_.get()).name_.c_str(),
               nullptr);
  shm_sub_ = std::make_unique<GstShmdataSubscriber>(
      shmsink_.get_raw(),
      [this](const std::string& caps) {
        this->graft_tree(
            ".shmdata.writer." + shmpath_,
            ShmdataUtils::make_tree(caps, ShmdataUtils::get_category(caps), ShmdataStat()));
      },
      ShmdataStat::make_tree_updater(this, ".shmdata.writer." + shmpath_));
  gst_bin_add_many(
      GST_BIN(gst_pipeline_->get_pipeline()), pulsesrc_.get_raw(), shmsink_.get_raw(), nullptr);
  gst_element_link_many(pulsesrc_.get_raw(), shmsink_.get_raw(), nullptr);
  gst_pipeline_->play(true);
  return true;
}
Example #5
0
bool GstDecodebin::on_shmdata_connect(const std::string& shmpath) {
  // creating shmdata reader
  g_object_set(
      G_OBJECT(shmsrc_.get_raw()), "copy-buffers", TRUE, "socket-path", shmpath.c_str(), nullptr);
  shmr_sub_ = std::make_unique<GstShmdataSubscriber>(
      shmsrc_.get_raw(),
      [this, shmpath](const std::string& caps) {
        this->graft_tree(
            ".shmdata.reader." + shmpath,
            ShmdataUtils::make_tree(caps, ShmdataUtils::get_category(caps), ShmdataStat()));
      },
      ShmdataStat::make_tree_updater(this, ".shmdata.writer." + shmpath));

  // creating decodebin
  std::unique_ptr<DecodebinToShmdata> decodebin = std::make_unique<DecodebinToShmdata>(
      gst_pipeline_.get(),
      [this](GstElement* el, const std::string& media_type, const std::string& media_label) {
        configure_shmdatasink(el, media_type, media_label);
      },
      true /*decompress*/);
  // adding to pipeline
  gst_bin_add(GST_BIN(gst_pipeline_->get_pipeline()), shmsrc_.get_raw());
  if (!decodebin->invoke_with_return<gboolean>([this](GstElement* el) {
        return gst_bin_add(GST_BIN(gst_pipeline_->get_pipeline()), el);
      })) {
    g_warning("decodebin cannot be added to pipeline");
  }
  // get pads and link
  GstPad* pad = gst_element_get_static_pad(shmsrc_.get_raw(), "src");
  On_scope_exit { gst_object_unref(GST_OBJECT(pad)); };
  GstPad* sinkpad = decodebin->invoke_with_return<GstPad*>(
      [](GstElement* el) { return gst_element_get_static_pad(el, "sink"); });
  On_scope_exit { gst_object_unref(GST_OBJECT(sinkpad)); };
  if (!GstUtils::check_pad_link_return(gst_pad_link(pad, sinkpad))) return false;
  // set media label if relevant
  auto caps = gst_pad_get_allowed_caps(pad);
  if (0 < gst_caps_get_size(caps)) {
    On_scope_exit { gst_caps_unref(caps); };
    auto structure = gst_caps_get_structure(caps, 0);
    auto media_label = gst_structure_get_string(structure, "media-label");
    if (nullptr != media_label)
      decodebin->set_media_label(gst_structure_get_string(structure, "media-label"));
  }
Example #6
0
bool Timelapse::start_timelapse(const std::string& shmpath) {
  {
    auto timelapse = timelapse_.find(shmpath);
    if (timelapse_.end() != timelapse) timelapse_.erase(timelapse);
  }
  auto img_path = img_dir_;
  auto img_from_shmpath =
      img_dir_.empty() ? shmpath : shmpath.substr(shmpath.find_last_of("/") + 1);
  img_path += img_name_.empty() ? img_from_shmpath : img_name_;
  if (num_files_ && std::string::npos == img_path.find('%'))
    img_path += "_%d.jpg";
  else if (img_name_.empty())
    img_path += ".jpg";
  timelapse_config_ = GstVideoTimelapseConfig(shmpath, img_path);
  timelapse_config_.framerate_num_ = framerate_.numerator();
  timelapse_config_.framerate_denom_ = framerate_.denominator();
  timelapse_config_.width_ = width_;
  timelapse_config_.height_ = height_;
  timelapse_config_.jpg_quality_ = jpg_quality_;
  timelapse_config_.max_files_ = max_files_;
  auto new_timelapse = std::make_unique<GstVideoTimelapse>(
      timelapse_config_,
      [this, shmpath](const std::string& caps) {
        graft_tree(".shmdata.reader." + shmpath,
                   ShmdataUtils::make_tree(caps, ShmdataUtils::get_category(caps), ShmdataStat()));
      },
      ShmdataStat::make_tree_updater(this, ".shmdata.reader." + shmpath),
      nullptr,
      [this, shmpath](std::string&& file_name) {
        if (!notify_last_file_) return;
        {
          auto lock = pmanage<MPtr(&PContainer::get_lock)>(last_image_id_);
          last_image_ = file_name;
        }
        pmanage<MPtr(&PContainer::notify)>(last_image_id_);
      });
  if (!new_timelapse.get()) return false;
  timelapse_[shmpath] = std::move(new_timelapse);
  return true;
}
Example #7
0
void HTTPSDPDec::configure_shmdatasink(GstElement* element,
                                       const std::string& media_type,
                                       const std::string& media_label) {
  auto count = counter_.get_count(media_label + media_type);
  std::string media_name = media_type;
  if (count != 0) media_name.append("-" + std::to_string(count));
  std::string shmpath;
  if (media_label.empty())
    shmpath = make_file_name(media_name);
  else
    shmpath = make_file_name(media_label + "-" + media_name);

  g_object_set(G_OBJECT(element), "socket-path", shmpath.c_str(), nullptr);
  shm_subs_.emplace_back(std::make_unique<GstShmdataSubscriber>(
      element,
      [this, shmpath](const std::string& caps) {
        this->graft_tree(
            ".shmdata.writer." + shmpath,
            ShmdataUtils::make_tree(caps, ShmdataUtils::get_category(caps), ShmdataStat()));
      },
      ShmdataStat::make_tree_updater(this, ".shmdata.writer." + shmpath)));
}