MediaServer::MediaServer(std::uint16_t port) :
    http::Server(port, new HTTPStreamingConnectionFactory(this))
{
    DebugL << "Create" << endl;

    // Register the media formats we will be using
    FormatRegistry& formats = MediaFactory::instance().formats();
    formats.registerFormat(Format("MP3", "mp3",
        AudioCodec("MP3", "libmp3lame", 2, 44100, 128000, "s16p")));
        // Adobe Flash Player requires that audio files be 16bit and have a sample rate of 44.1khz.
        // Flash Player can handle MP3 files encoded at 32kbps, 48kbps, 56kbps, 64kbps, 128kbps, 160kbps or 256kbps.
        // NOTE: 128000 works fine for 44100, but 64000 is borked!

    formats.registerFormat(Format("FLV", "flv",
        VideoCodec("FLV", "flv", 320, 240)));

    formats.registerFormat(Format("FLV-Speex", "flv",
        VideoCodec("FLV", "flv", 320, 240),
        AudioCodec("Speex", "libspeex", 1, 16000)));

    formats.registerFormat(Format("Speex", "flv",
        AudioCodec("Speex", "libspeex", 1, 16000)));

    formats.registerFormat(Format("MJPEG", "mjpeg",
        VideoCodec("MJPEG", "mjpeg", 480, 320, 20)));

    // TODO: Add h264 and newer audio formats when time permits
}
Exemple #2
0
std::unique_ptr<Reply> M3Handler::HandleMessage(Message* message) {
  // FIXME : resolve clashes between wds exported and internal rtsp type names.
  //using namespace rtsp;
  auto received_payload = ToGetParameterPayload(message->payload());
  if (!received_payload)
    return nullptr;

  auto reply = std::unique_ptr<Reply>(new Reply(rtsp::STATUS_OK));
  auto reply_payload = new rtsp::PropertyMapPayload();
  for (const std::string& property : received_payload->properties()) {
      std::shared_ptr<rtsp::Property> new_prop;
      if (property == GetPropertyName(rtsp::AudioCodecsPropertyType)){
          // FIXME: declare that we support absolutely every audio codec/format,
          // but there should be a MediaManager API for it
          auto codec_lpcm = AudioCodec(LPCM, AudioModes(3), 0);
          auto codec_aac = AudioCodec(AAC, AudioModes(15), 0);
          auto codec_ac3 = AudioCodec(AC3, AudioModes(7), 0);
          std::vector<AudioCodec> codec_list;
          codec_list.push_back(codec_lpcm);
          codec_list.push_back(codec_aac);
          codec_list.push_back(codec_ac3);
          new_prop.reset(new rtsp::AudioCodecs(codec_list));
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::VideoFormatsPropertyType)){
          new_prop.reset(new rtsp::VideoFormats(ToSinkMediaManager(manager_)->GetNativeVideoFormat(),
              false,
              ToSinkMediaManager(manager_)->GetSupportedH264VideoCodecs()));
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::Video3DFormatsPropertyType)){
          new_prop.reset(new rtsp::Formats3d());
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::ContentProtectionPropertyType)){
          new_prop.reset(new rtsp::ContentProtection());
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::DisplayEdidPropertyType)){
          new_prop.reset(new rtsp::DisplayEdid());
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::CoupledSinkPropertyType)){
          new_prop.reset(new rtsp::CoupledSink());
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::ClientRTPPortsPropertyType)){
          new_prop.reset(new rtsp::ClientRtpPorts(
              ToSinkMediaManager(manager_)->GetLocalRtpPorts().first,
              ToSinkMediaManager(manager_)->GetLocalRtpPorts().second));
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::I2CPropertyType)){
          new_prop.reset(new rtsp::I2C(0));
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::UIBCCapabilityPropertyType)){
          new_prop.reset(new rtsp::UIBCCapability());
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::ConnectorTypePropertyType)){
          new_prop.reset(new rtsp::ConnectorType(ToSinkMediaManager(manager_)->GetConnectorType()));
          reply_payload->AddProperty(new_prop);
      } else if (property == GetPropertyName(rtsp::StandbyResumeCapabilityPropertyType)){
          new_prop.reset(new rtsp::StandbyResumeCapability(false));
          reply_payload->AddProperty(new_prop);
      } else {
          WDS_WARNING("** GET_PARAMETER: Ignoring unsupported property '%s'.", property.c_str());
      }
  }
  reply->set_payload(std::unique_ptr<Payload>(reply_payload));

  return reply;
}