Package net.pms.encoders

Source Code of net.pms.encoders.VideoLanVideoStreaming

/*
* PS3 Media Server, for streaming any medias to your PS3.
* Copyright (C) 2008  A.Brochard
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
package net.pms.encoders;

import com.sun.jna.Platform;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import net.pms.configuration.PmsConfiguration;
import net.pms.dlna.DLNAMediaInfo;
import net.pms.dlna.DLNAResource;
import net.pms.formats.Format;
import net.pms.io.OutputParams;
import net.pms.io.PipeProcess;
import net.pms.io.ProcessWrapper;
import net.pms.io.ProcessWrapperImpl;
import net.pms.util.PlayerUtil;

/* XXX this is the old/obsolete VLC web video streaming engine */
public class VideoLanVideoStreaming extends Player {
  public static final String ID = "vlcvideo";

  @Deprecated
  public VideoLanVideoStreaming(PmsConfiguration configuration) {
    this();
  }

  public VideoLanVideoStreaming() {
  } 

  @Override
  public int purpose() {
    return VIDEO_WEBSTREAM_PLAYER;
  }

  @Override
  public String id() {
    return ID;
  }

  @Override
  public String[] args() {
    return new String[]{};
  }

  @Override
  public String name() {
    return "VLC Web Video (Legacy)";
  }

  @Override
  public int type() {
    return Format.VIDEO;
  }

  @Override
  public String mimeType() {
    return "video/mpeg";
  }

  @Override
  public String executable() {
    return configuration.getVlcPath();
  }

  protected String getEncodingArgs() {
    /*
      FIXME (or, rather, FIXVLC): channels=2 causes various recent VLCs (from 1.1.4 to 1.1.7)
      to segfault on both Windows and Linux.

      Similar issue (the workaround doesn't work here):

      https://forum.videolan.org/viewtopic.php?f=13&t=83154&p=275196#p275034

      Reproduce:

      vlc -vv -I dummy --sout \
      #transcode{vcodec=mp2v,vb=4096,fps=25,scale=1,acodec=mpga,ab=128,channels=2} \
      :standard{access=file,mux=ts,dst="deleteme.tmp"} \
      http://feedproxy.google.com/~r/TEDTalks_video/~5/wdul2VS10rw/BillGates_2011U.mp4 vlc://quit
     */

    return "vcodec=mp2v,vb=4096,scale=1,acodec=mp2a,ab=128,channels=2";
  }

  protected String getMux() {
    return "ts";
  }

  @Override
  public ProcessWrapper launchTranscode(
    DLNAResource dlna,
    DLNAMediaInfo media,
    OutputParams params) throws IOException {
    boolean isWindows = Platform.isWindows();
    final String filename = dlna.getSystemName();
    PipeProcess tsPipe = new PipeProcess("VLC" + System.currentTimeMillis() + "." + getMux());
    ProcessWrapper pipe_process = tsPipe.getPipeProcess();

    // XXX it can take a long time for Windows to create a named pipe
    // (and mkfifo can be slow if /tmp isn't memory-mapped), so start this as early as possible
    pipe_process.runInNewThread();
    tsPipe.deleteLater();

    params.input_pipes[0] = tsPipe;
    params.minBufferSize = params.minFileSize;
    params.secondread_minsize = 100000;

    List<String> cmdList = new ArrayList<>();
    cmdList.add(executable());
    cmdList.add("-I");
    cmdList.add("dummy");

    // TODO: either
    // 1) add this automatically if enabled (probe)
    // 2) add a GUI option to "enable GPU acceleration"
    // 3) document it as an option the user can enable themselves in the vlc GUI (saved to a config file used by cvlc)
    // XXX: it's still experimental (i.e. unstable), causing (consistent) segfaults on Windows and Linux,
    // so don't even document it for now
    // cmdList.add("--ffmpeg-hw");

    String transcodeSpec = String.format(
      "#transcode{%s}:standard{access=file,mux=%s,dst=\"%s%s\"}",
      getEncodingArgs(),
      getMux(),
      (isWindows ? "\\\\" : ""),
      tsPipe.getInputPipe()
    );

    // XXX there's precious little documentation on how (if at all) VLC
    // treats colons and hyphens (and :name= and --name=) differently
    // so we just have to test it ourselves
    // these work fine on Windows and Linux with VLC 1.1.x

    if (isWindows) {
      cmdList.add("--dummy-quiet");
    }
    if (isWindows || Platform.isMac()) {
      cmdList.add("--sout=" + transcodeSpec);
    } else {
      cmdList.add("--sout");
      cmdList.add(transcodeSpec);
    }

    // FIXME: cargo-culted from here:
    // via: https://code.google.com/p/ps3mediaserver/issues/detail?id=711
    if (Platform.isMac()) {
      cmdList.add("");
    }
    cmdList.add(filename);
    cmdList.add("vlc://quit");

    String[] cmdArray = new String[cmdList.size()];
    cmdList.toArray(cmdArray);

    cmdArray = finalizeTranscoderArgs(
      filename,
      dlna,
      media,
      params,
      cmdArray);

    ProcessWrapperImpl pw = new ProcessWrapperImpl(cmdArray, params);
    pw.attachProcess(pipe_process);

    try {
      Thread.sleep(150);
    } catch (InterruptedException e) {
    }

    pw.runInNewThread();
    return pw;
  }

  @Override
  public JComponent config() {
    return null;
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public boolean isCompatible(DLNAResource resource) {
    return PlayerUtil.isWebVideo(resource);
  }
}
TOP

Related Classes of net.pms.encoders.VideoLanVideoStreaming

TOP
Copyright © 2018 www.massapi.com. 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.