Package net.pms.configuration

Examples of net.pms.configuration.RendererConfiguration


      int receivedContentLength = -1;
      String headerLine = br.readLine();
      String userAgentString = null;
      StringBuilder unknownHeaders = new StringBuilder();
      String separator = "";
      RendererConfiguration renderer = null;

      InetSocketAddress remoteAddress = (InetSocketAddress) socket.getRemoteSocketAddress();
      InetAddress ia = remoteAddress.getAddress();

      // Apply the IP filter
      if (filterIp(ia)) {
        throw new IOException("Access denied for address " + ia + " based on IP filter");
      }

      logger.trace("Opened request handler on socket " + socket);
      PMS.get().getRegistry().disableGoToSleep();

      while (headerLine != null && headerLine.length() > 0) {
        logger.trace("Received on socket: " + headerLine);

        // The request object is created inside the while loop.
        if (request != null && request.getMediaRenderer() == null) {
          // The handler makes a couple of attempts to recognize a renderer from its requests.
          // IP address matches from previous requests are preferred, when that fails request
          // header matches are attempted and if those fail as well we're stuck with the
          // default renderer.

          // Attempt 1: try to recognize the renderer by its socket address
          renderer = RendererConfiguration.getRendererConfigurationBySocketAddress(ia);

          if (renderer != null) {
            PMS.get().setRendererFound(renderer);
            request.setMediaRenderer(renderer);
            logger.trace("Matched media renderer \"" + renderer.getRendererName() + "\" based on address " + ia);
          }
        }

        if (renderer == null && headerLine != null
            && headerLine.toUpperCase().startsWith("USER-AGENT")
            && request != null) {
          userAgentString = headerLine.substring(headerLine.indexOf(":") + 1).trim();

          // Attempt 2: try to recognize the renderer by matching the "User-Agent" header
          renderer = RendererConfiguration.getRendererConfigurationByUA(userAgentString);

          if (renderer != null) {
            PMS.get().setRendererFound(renderer);
            request.setMediaRenderer(renderer);
            renderer.associateIP(ia)// Associate IP address for later requests
            logger.trace("Matched media renderer \"" + renderer.getRendererName() + "\" based on header \"" + headerLine + "\"");
          }
        }
        if (renderer == null && headerLine != null && request != null) {
          // Attempt 3: try to recognize the renderer by matching an additional header
          renderer = RendererConfiguration.getRendererConfigurationByUAAHH(headerLine);

          if (renderer != null) {
            PMS.get().setRendererFound(renderer);
            request.setMediaRenderer(renderer);
            renderer.associateIP(ia)// Associate IP address for later requests
            logger.trace("Matched media renderer \"" + renderer.getRendererName() + "\" based on header \"" + headerLine + "\"");
          }
        }
        try {
          StringTokenizer s = new StringTokenizer(headerLine);
          String temp = s.nextToken();
View Full Code Here


   */
  public List<String> getVideoFilterOptions(DLNAResource dlna, DLNAMediaInfo media, OutputParams params) throws IOException {
    List<String> options = new ArrayList<String>();
    String subsOption = null;
    String padding = null;
    final RendererConfiguration renderer = params.mediaRenderer;

    DLNAMediaSubtitle tempSubs = null;
    if (!isDisableSubtitles(params)) {
      tempSubs = getSubtitles(params);
    }

    final boolean isResolutionTooHighForRenderer = renderer.isVideoRescale() // renderer defines a max width/height
        && (media != null && media.isMediaparsed())
        && ((media.getWidth() > renderer.getMaxVideoWidth())
          || (media.getHeight() > renderer.getMaxVideoHeight()));

    if (tempSubs != null) {
      StringBuilder s = new StringBuilder();
      CharacterIterator it = new StringCharacterIterator(ProcessUtil.getShortFileNameIfWideChars(tempSubs.getExternalFile().getAbsolutePath()));

      for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
        switch (ch) {
          case ':':
            s.append("\\\\:");
            break;
          case '\\':
            s.append("/");
            break;
          case ']':
            s.append("\\]");
            break;
          case '[':
            s.append("\\[");
            break;
          default:
            s.append(ch);
        }
      }

      String subsFile = s.toString();
      subsFile = subsFile.replace(",", "\\,");
      subsOption = "subtitles=" + subsFile;
    }

    if (renderer.isPadVideoWithBlackBordersTo169AR() && renderer.isRescaleByRenderer()) {
      if (media != null
        && media.isMediaparsed()
        && media.getHeight() != 0
        && (media.getWidth() / (double) media.getHeight()) >= (16 / (double) 9)) {
        padding = "pad=iw:iw/(16/9):0:(oh-ih)/2";
      } else {
        padding = "pad=ih*(16/9):ih:(ow-iw)/2:0";
      }
    }

    String rescaleSpec = null;

    if (isResolutionTooHighForRenderer || (renderer.isPadVideoWithBlackBordersTo169AR() && !renderer.isRescaleByRenderer())) {
      rescaleSpec = String.format(
        // http://stackoverflow.com/a/8351875
        "scale=iw*min(%1$d/iw\\,%2$d/ih):ih*min(%1$d/iw\\,%2$d/ih),pad=%1$d:%2$d:(%1$d-iw)/2:(%2$d-ih)/2",
        renderer.getMaxVideoWidth(),
        renderer.getMaxVideoHeight()
      );
    }

    String overrideVF = renderer.getFFmpegVideoFilterOverride();

    if (rescaleSpec != null || padding != null || overrideVF != null || subsOption != null) {
      options.add("-vf");
      StringBuilder filterParams = new StringBuilder();

View Full Code Here

   * to its <code>TranscodeVideo</code> profile.
   */
  public synchronized List<String> getVideoTranscodeOptions(DLNAResource dlna, DLNAMediaInfo media, OutputParams params) {
    List<String> options = new ArrayList<String>();
    final String filename = dlna.getSystemName();
    final RendererConfiguration renderer = params.mediaRenderer;

    if (renderer.isTranscodeToWMV() && !renderer.isXBOX()) { // WMV
      options.add("-c:v");
      options.add("wmv2");

      options.add("-c:a");
      options.add("wmav2");

      options.add("-f");
      options.add("asf");
    } else { // MPEGPSAC3, MPEGTSAC3 or H264TSAC3
      if (isAc3Remux()) {
        // AC-3 remux
        options.add("-c:a");
        options.add("copy");
      } else if (isDtsRemux()) {
        // Audio is added in a separate process later
        options.add("-an");
      } else if (type() == Format.AUDIO) {
        // Skip
      } else {
        options.add("-c:a");
        options.add("ac3");
      }

      InputFile newInput = null;
      if (filename != null) {
        newInput = new InputFile();
        newInput.setFilename(filename);
        newInput.setPush(params.stdin);
      }

      // Output video codec
      if (media.isMediaparsed()
          && params.sid == null
          && ((newInput != null && media.isVideoWithinH264LevelLimits(newInput, params.mediaRenderer))
            || !params.mediaRenderer.isH264Level41Limited())
          && media.isMuxable(params.mediaRenderer)
          && configuration.isFFmpegMuxWhenCompatible()
          && params.mediaRenderer.isMuxH264MpegTS()) {

        options.add("-c:v");
        options.add("copy");
        options.add("-bsf");
        options.add("h264_mp4toannexb");
        options.add("-fflags");
        options.add("+genpts");
        // Set correct container aspect ratio if remuxed video track has different AR
        // TODO does not work with ffmpeg 1.2
        // https://ffmpeg.org/trac/ffmpeg/ticket/2046
        // possible solution http://forum.doom9.org/showthread.php?t=152419
        //
        // if (media.isAspectRatioMismatch()) {
        //  options.add("-aspect");
        //  options.add(media.getAspectRatioContainer());
        // }

        setVideoRemux(true);
      } else if (renderer.isTranscodeToH264TSAC3()) {
        options.add("-c:v");
        options.add("libx264");
        options.add("-crf");
        options.add("20");
        options.add("-preset");
        options.add("superfast");
      } else if (!isDtsRemux()) {
        options.add("-c:v");
        options.add("mpeg2video");
      }

      // Output file format
      options.add("-f");
      if (isDtsRemux()) {
        if (isVideoRemux()) {
          options.add("rawvideo");
        } else {
          options.add("mpeg2video");
        }
      } else if (renderer.isTranscodeToMPEGTSAC3() || renderer.isTranscodeToH264TSAC3() || isVideoRemux()) { // MPEGTSAC3
        options.add("mpegts");
      } else { // default: MPEGPSAC3
        options.add("vob");
      }
    }
View Full Code Here

    DLNAMediaInfo media,
    OutputParams params
  ) throws IOException {
    int nThreads = configuration.getNumberOfCpuCores();
    List<String> cmdList = new ArrayList<String>();
    RendererConfiguration renderer = params.mediaRenderer;
    final String filename = dlna.getSystemName();
    setAudioAndSubs(filename, media, params, configuration);
    params.waitbeforestart = 2500;

    cmdList.add(executable());
    cmdList.addAll(getGlobalOptions(logger));

    if (params.timeseek > 0) {
      cmdList.add("-ss");
      cmdList.add("" + params.timeseek);
    }

    // decoder threads
    cmdList.add("-threads");
    cmdList.add("" + nThreads);

    final boolean isTsMuxeRVideoEngineEnabled = configuration.getEnginesAsList().contains(TsMuxeRVideo.ID);

    setAc3Remux(false);
    setDtsRemux(false);
    setVideoRemux(false);

    if (configuration.isAudioRemuxAC3() && params.aid != null && params.aid.isAC3() && renderer.isTranscodeToAC3()) {
      // AC-3 remux takes priority
      setAc3Remux(true);
    } else if (isTsMuxeRVideoEngineEnabled && configuration.isAudioEmbedDtsInPcm() && params.aid != null && params.aid.isDTS() && params.mediaRenderer.isDTSPlayable()) {
      // Now check for DTS remux
      setDtsRemux(true);
    }

    String frameRateRatio = media.getValidFps(true);
    String frameRateNumber = media.getValidFps(false);

    // Input filename
    cmdList.add("-i");
    cmdList.add(filename);

    if (media.getAudioTracksList().size() > 1) {
      // Set the video stream
      cmdList.add("-map");
      cmdList.add("0:v");

      // Set the proper audio stream
      cmdList.add("-map");
      cmdList.add("0:a:" + (media.getAudioTracksList().indexOf(params.aid)));
    }

    // Encoder threads
    cmdList.add("-threads");
    cmdList.add("" + nThreads);

    if (params.timeend > 0) {
      cmdList.add("-t");
      cmdList.add("" + params.timeend);
    }

    // add video bitrate options (-b:a)
    // cmdList.addAll(getVideoBitrateOptions(filename, dlna, media, params));

    // add audio bitrate options (-b:v)
    // cmdList.addAll(getAudioBitrateOptions(filename, dlna, media, params));

    // if the source is too large for the renderer, resize it
    // and/or add subtitles to video filter
    // FFmpeg must be compiled with --enable-libass parameter
    cmdList.addAll(getVideoFilterOptions(dlna, media, params));

    int defaultMaxBitrates[] = getVideoBitrateConfig(configuration.getMaximumBitrate());
    int rendererMaxBitrates[] = new int[2];

    if (renderer.getMaxVideoBitrate() != null) {
      rendererMaxBitrates = getVideoBitrateConfig(renderer.getMaxVideoBitrate());
    }
   
    // Give priority to the renderer's maximum bitrate setting over the user's setting
    if (rendererMaxBitrates[0] > 0 && rendererMaxBitrates[0] < defaultMaxBitrates[0]) {
      defaultMaxBitrates = rendererMaxBitrates;
    }

    if (params.mediaRenderer.getCBRVideoBitrate() == 0) {
      // Convert value from Mb to Kb
      defaultMaxBitrates[0] = 1000 * defaultMaxBitrates[0];

      // Halve it since it seems to send up to 1 second of video in advance
      defaultMaxBitrates[0] = defaultMaxBitrates[0] / 2;

      int bufSize = 1835;
      // x264 uses different buffering math than MPEG-2
      if (!renderer.isTranscodeToH264TSAC3()) {
        if (media.isHDVideo()) {
          bufSize = defaultMaxBitrates[0] / 3;
        }

        if (bufSize > 7000) {
          bufSize = 7000;
        }

        if (defaultMaxBitrates[1] > 0) {
          bufSize = defaultMaxBitrates[1];
        }

        if (params.mediaRenderer.isDefaultVBVSize() && rendererMaxBitrates[1] == 0) {
          bufSize = 1835;
        }
      }

      // Make room for audio
      if (isDtsRemux()) {
        defaultMaxBitrates[0] = defaultMaxBitrates[0] - 1510;
      } else {
        defaultMaxBitrates[0] = defaultMaxBitrates[0] - configuration.getAudioBitrate();
      }

      // Round down to the nearest Mb
      defaultMaxBitrates[0] = defaultMaxBitrates[0] / 1000 * 1000;

      // FFmpeg uses bytes for inputs instead of kbytes like MEncoder
      bufSize = bufSize * 1000;
      defaultMaxBitrates[0] = defaultMaxBitrates[0] * 1000;

      /**
       * Level 4.1-limited renderers like the PS3 can stutter when H.264 video exceeds
       * this bitrate
       */
      if (renderer.isTranscodeToH264TSAC3() || isVideoRemux()) {
        if (
          params.mediaRenderer.isH264Level41Limited() &&
          defaultMaxBitrates[0] > 31250000
        ) {
          defaultMaxBitrates[0] = 31250000;
        }
        bufSize = defaultMaxBitrates[0];
      }

      cmdList.add("-bufsize");
      cmdList.add("" + bufSize);

      cmdList.add("-maxrate");
      cmdList.add("" + defaultMaxBitrates[0]);
    }

    // Set audio bitrate and channel count only when doing audio transcoding
    if (!isAc3Remux() && !isDtsRemux() && !(type() == Format.AUDIO)) {
      int channels;
      if (renderer.isTranscodeToWMV() && !renderer.isXBOX()) {
        channels = 2;
      } else {
        channels = configuration.getAudioChannelCount(); // 5.1 max for AC-3 encoding
      }
      cmdList.add("-ac");
      cmdList.add("" + channels);

      cmdList.add("-ab");
      cmdList.add(configuration.getAudioBitrate() + "k");
    }

    if (params.timeseek > 0) {
      cmdList.add("-copypriorss");
      cmdList.add("0");
      cmdList.add("-avoid_negative_ts");
      cmdList.add("1");
    }

    // Add MPEG-2 quality settings
    if (!renderer.isTranscodeToH264TSAC3() && !isVideoRemux()) {
      String mpeg2Options = configuration.getMPEG2MainSettingsFFmpeg();
      String mpeg2OptionsRenderer = params.mediaRenderer.getCustomFFmpegMPEG2Options();

      // Renderer settings take priority over user settings
      if (isNotBlank(mpeg2OptionsRenderer)) {
        mpeg2Options = mpeg2OptionsRenderer;
      } else {
        if (mpeg2Options.contains("Automatic")) {
          mpeg2Options = "-g 5 -q:v 1 -qmin 2 -qmax 3";

          // It has been reported that non-PS3 renderers prefer keyint 5 but prefer it for PS3 because it lowers the average bitrate
          if (params.mediaRenderer.isPS3()) {
            mpeg2Options = "-g 25 -q:v 1 -qmin 2 -qmax 3";
          }

          if (mpeg2Options.contains("Wireless") || defaultMaxBitrates[0] < 70) {
            // Lower quality for 720p+ content
            if (media.getWidth() > 1280) {
              mpeg2Options = "-g 25 -qmax 7 -qmin 2";
            } else if (media.getWidth() > 720) {
              mpeg2Options = "-g 25 -qmax 5 -qmin 2";
            }
          }
        }
      }

      String[] customOptions = StringUtils.split(mpeg2Options);
      cmdList.addAll(new ArrayList<String>(Arrays.asList(customOptions)));
    }

    // Add the output options (-f, -c:a, -c:v, etc.)
    cmdList.addAll(getVideoTranscodeOptions(dlna, media, params));

    // Add custom options
    if (StringUtils.isNotEmpty(renderer.getCustomFFmpegOptions())) {
      parseOptions(renderer.getCustomFFmpegOptions(), cmdList);
    }

    if (!isDtsRemux()) {
      cmdList.add("pipe:");
    }
View Full Code Here

  ) throws IOException {
    params.minBufferSize = params.minFileSize;
    params.secondread_minsize = 100000;
    params.waitbeforestart = 6000;

    RendererConfiguration renderer = params.mediaRenderer;
    String filename = protocols.getFilename(dlna.getSystemName());
    FFmpegOptions customOptions = new FFmpegOptions();

    // (HTTP) header options
    if (params.header != null && params.header.length > 0) {
      String hdr = new String(params.header);
      customOptions.addAll(parseOptions(hdr));
    }

    // renderer options
    if (isNotEmpty(renderer.getCustomFFmpegOptions())) {
      customOptions.addAll(parseOptions(renderer.getCustomFFmpegOptions()));
    }

    // basename of the named pipe:
    // ffmpeg -global-options -input-options -i URL -output-options /path/to/fifoName
    String fifoName = String.format(
View Full Code Here

          @Override
          public void run() {
            InetAddress rendererIpAddress;
            try {
              rendererIpAddress = InetAddress.getByName(rendererId);
              RendererConfiguration renderer = RendererConfiguration.getRendererConfigurationBySocketAddress(rendererIpAddress);
              String rendererName = "unknown renderer";
              try {
                rendererName = renderer.getRendererName();
              } catch (NullPointerException e) { }
              logger.info("Started sending {} to {} on {}", getSystemName(), rendererName, rendererId);
            } catch (UnknownHostException ex) {
              logger.debug("" + ex);
            }
View Full Code Here

            public void run() {
              if (refCount == 1) {
                InetAddress rendererIpAddress;
                try {
                  rendererIpAddress = InetAddress.getByName(rendererId);
                  RendererConfiguration renderer = RendererConfiguration.getRendererConfigurationBySocketAddress(rendererIpAddress);
                  String rendererName = "unknown renderer";
                  try {
                    rendererName = renderer.getRendererName();
                  } catch (NullPointerException e) { }
                  logger.info("Stopped sending {} to {} on {}", getSystemName(), rendererName, rendererId);
                } catch (UnknownHostException ex) {
                  logger.debug("" + ex);
                }
View Full Code Here

  protected void resolveOnce() {
    if (getChildren().size() == 1) { // OK
      DLNAResource child = getChildren().get(0);
      child.resolve();

      RendererConfiguration renderer = null;
      if (this.getParent() != null) {
        renderer = this.getParent().getDefaultRenderer();
      }

      // First, add the option to simply stream the resource.
      // Only add the option if the renderer is compatible with the format
      if (
        child.getFormat() != null
        && (
          child.getFormat().isCompatible(child.getMedia(), renderer)
          || child.isSkipTranscode()
        )
      ) {
        if (renderer != null) {
          logger.trace(
            "Duplicating {} for direct streaming to renderer: {}",
            child.getName(),
            renderer.getRendererName()
          );
        }

        DLNAResource noTranscode = createResourceWithAudioSubtitlePlayer(child, null, null, null);
        addChildInternal(noTranscode);
View Full Code Here

   *         otherwise.
   *
   * @since 1.50.1
   */
  public boolean isCompatible(DLNAMediaInfo media, RendererConfiguration renderer) {
    RendererConfiguration referenceRenderer;

    if (renderer != null) {
      // Use the provided renderer as reference
      referenceRenderer = renderer;
    } else {
      // Use the default renderer as reference
      referenceRenderer = RendererConfiguration.getDefaultConf();
    }

    // Let the renderer configuration decide on native compatibility
    return referenceRenderer.isCompatible(media, this);
  }
View Full Code Here

     */
    @Test
  public void testRendererConfigurationBasics() {
      // This test is only useful if the MediaInfo library is available
    assumeTrue(mediaInfoParserIsValid);
    RendererConfiguration conf = RendererConfiguration.getRendererConfigurationByName("Playstation 3");
    assertNotNull("Renderer named \"Playstation 3\" found.", conf);
    assertEquals("With nothing provided isCompatible() should return false", false,
        conf.isCompatible(null, null));
  }
View Full Code Here

TOP

Related Classes of net.pms.configuration.RendererConfiguration

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.