[AV] Removed unused code, merged av and transcode
This commit is contained in:
@@ -0,0 +1,306 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <array>
|
||||
|
||||
#include "logger/Logger.hpp"
|
||||
|
||||
#include "AvInfo.hpp"
|
||||
|
||||
namespace Av {
|
||||
|
||||
static std::string streamType_to_string(Stream::Type type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case Stream::Type::Audio: return "audio";
|
||||
case Stream::Type::Video: return "video";
|
||||
case Stream::Type::Subtitle: return "subtitle";
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
static std::string averror_to_string(int error)
|
||||
{
|
||||
std::array<char, 128> buf = {0};
|
||||
|
||||
if (av_strerror(error, buf.data(), buf.size()) == 0)
|
||||
return std::string(&buf[0]);
|
||||
else
|
||||
return "Unknown error";
|
||||
}
|
||||
|
||||
|
||||
void AvInit()
|
||||
{
|
||||
/* register all the codecs */
|
||||
avcodec_register_all();
|
||||
av_register_all();
|
||||
LMS_LOG(MOD_AV, SEV_INFO) << "avcodec version = " << avcodec_version();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
MediaFile::MediaFile(const boost::filesystem::path& p)
|
||||
: _p(p), _context(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
MediaFile::~MediaFile()
|
||||
{
|
||||
if (_context != nullptr)
|
||||
avformat_close_input(&_context);
|
||||
}
|
||||
|
||||
bool
|
||||
MediaFile::open(void)
|
||||
{
|
||||
if (_context != nullptr)
|
||||
throw std::logic_error("inputfile '" + _p.string() + "' already open");
|
||||
|
||||
int error = avformat_open_input(&_context, _p.string().c_str(), nullptr, nullptr);
|
||||
if (error < 0)
|
||||
{
|
||||
LMS_LOG(MOD_AV, SEV_ERROR) << "Cannot open '" << _p.string() << "', avformat_open_input returned " << averror_to_string(error);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
MediaFile::scan(void)
|
||||
{
|
||||
if (_context == nullptr)
|
||||
throw std::logic_error("inputfile '" + _p.string() + "' not open");
|
||||
|
||||
int error = avformat_find_stream_info(_context, nullptr);
|
||||
if (error < 0)
|
||||
{
|
||||
LMS_LOG(MOD_AV, SEV_ERROR) << "Cannot find stream information: '" << averror_to_string(error);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boost::posix_time::time_duration
|
||||
MediaFile::getDuration() const
|
||||
{
|
||||
if (_context == nullptr)
|
||||
throw std::logic_error("inputfile '" + _p.string() + "' not open");
|
||||
|
||||
if (static_cast<int>(_context->duration) != AV_NOPTS_VALUE )
|
||||
return boost::posix_time::seconds(_context->duration / AV_TIME_BASE);
|
||||
else
|
||||
return boost::posix_time::seconds(0); // TODO, do something better?
|
||||
}
|
||||
|
||||
void
|
||||
getMetaDataFromDictionnary(AVDictionary* dictionnary, std::map<std::string, std::string>& res)
|
||||
{
|
||||
if (!dictionnary)
|
||||
return;
|
||||
|
||||
AVDictionaryEntry *tag = NULL;
|
||||
while ((tag = av_dict_get(dictionnary, "", tag, AV_DICT_IGNORE_SUFFIX)))
|
||||
{
|
||||
res.insert( std::make_pair(tag->key, tag->value));
|
||||
}
|
||||
}
|
||||
|
||||
std::map<std::string, std::string>
|
||||
MediaFile::getMetaData(void)
|
||||
{
|
||||
if (_context == nullptr)
|
||||
throw std::logic_error("inputfile '" + _p.string() + "' not open");
|
||||
|
||||
std::map<std::string, std::string> res;
|
||||
|
||||
getMetaDataFromDictionnary(_context->metadata, res);
|
||||
|
||||
// HACK for OGG files
|
||||
// If we did not find tags, search metadata in streams
|
||||
if (res.empty())
|
||||
{
|
||||
for (std::size_t i = 0; i < _context->nb_streams; ++i)
|
||||
{
|
||||
getMetaDataFromDictionnary(_context->streams[i]->metadata, res);
|
||||
|
||||
if (!res.empty())
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
std::vector<Stream>
|
||||
MediaFile::getStreams(Stream::Type type) const
|
||||
{
|
||||
if (_context == nullptr)
|
||||
throw std::logic_error("inputfile '" + _p.string() + "' not open");
|
||||
|
||||
std::vector<Stream> res;
|
||||
|
||||
for (std::size_t i = 0; i < _context->nb_streams; ++i)
|
||||
{
|
||||
AVStream* avstream = _context->streams[i];
|
||||
|
||||
// Skip attached pics
|
||||
if (avstream->disposition & AV_DISPOSITION_ATTACHED_PIC)
|
||||
continue;
|
||||
|
||||
if (avstream->codec == nullptr)
|
||||
{
|
||||
LMS_LOG(MOD_AV, SEV_ERROR) << "Skipping stream " << i << " since no codec is set";
|
||||
continue;
|
||||
}
|
||||
|
||||
if (type == Stream::Type::Audio && avstream->codec->codec_type != AVMEDIA_TYPE_AUDIO)
|
||||
continue;
|
||||
else if (type == Stream::Type::Video && avstream->codec->codec_type != AVMEDIA_TYPE_VIDEO)
|
||||
continue;
|
||||
else if (type == Stream::Type::Subtitle && avstream->codec->codec_type != AVMEDIA_TYPE_SUBTITLE)
|
||||
continue;
|
||||
|
||||
Stream stream;
|
||||
|
||||
stream.id = i; // or use stream->id ?
|
||||
stream.type = type;
|
||||
stream.bitrate = avstream->codec->bit_rate;
|
||||
|
||||
{
|
||||
std::array<char, 256> buf = {0};
|
||||
avcodec_string(buf.data(), buf.size(), avstream->codec, 0);
|
||||
|
||||
stream.desc = buf.data();
|
||||
}
|
||||
|
||||
res.push_back(stream);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int
|
||||
MediaFile::getBestStreamId(Stream::Type type) const
|
||||
{
|
||||
if (_context == nullptr)
|
||||
throw std::logic_error("inputfile '" + _p.string() + "' not open");
|
||||
|
||||
enum AVMediaType avMediaType;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case Stream::Type::Audio: avMediaType = AVMEDIA_TYPE_AUDIO; break;
|
||||
case Stream::Type::Video: avMediaType = AVMEDIA_TYPE_VIDEO; break;
|
||||
case Stream::Type::Subtitle: avMediaType = AVMEDIA_TYPE_SUBTITLE; break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int res = av_find_best_stream(_context,
|
||||
avMediaType,
|
||||
-1, // Auto
|
||||
-1, // Auto
|
||||
NULL,
|
||||
0);
|
||||
if (res < 0)
|
||||
{
|
||||
LMS_LOG(MOD_AV, SEV_ERROR) << "Cannot find best stream for type " << streamType_to_string(type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
bool
|
||||
MediaFile::hasAttachedPictures(void) const
|
||||
{
|
||||
for (std::size_t i = 0; i < _context->nb_streams; ++i)
|
||||
{
|
||||
if (_context->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<Picture>
|
||||
MediaFile::getAttachedPictures(std::size_t nbMaxPictures) const
|
||||
{
|
||||
if (_context == nullptr)
|
||||
throw std::logic_error("inputfile '" + _p.string() + "' not open");
|
||||
|
||||
static const std::map<int, std::string> codecMimeMap =
|
||||
{
|
||||
{ AV_CODEC_ID_BMP, "image/x-bmp" },
|
||||
{ AV_CODEC_ID_GIF, "image/gif" },
|
||||
{ AV_CODEC_ID_MJPEG, "image/jpeg" },
|
||||
{ AV_CODEC_ID_PNG, "image/png" },
|
||||
{ AV_CODEC_ID_PNG, "image/x-png" },
|
||||
{ AV_CODEC_ID_PPM, "image/x-portable-pixmap" },
|
||||
};
|
||||
|
||||
std::vector<Picture> pictures;
|
||||
|
||||
for (std::size_t i = 0; i < _context->nb_streams; ++i)
|
||||
{
|
||||
AVStream *avstream = _context->streams[i];
|
||||
|
||||
// Skip attached pics
|
||||
if (!(avstream->disposition & AV_DISPOSITION_ATTACHED_PIC))
|
||||
continue;
|
||||
|
||||
if (avstream->codec == nullptr)
|
||||
{
|
||||
LMS_LOG(MOD_AV, SEV_ERROR) << "Skipping stream " << i << " since no codec is set";
|
||||
continue;
|
||||
}
|
||||
|
||||
Picture picture;
|
||||
|
||||
auto itMime = codecMimeMap.find(avstream->codec->codec_id);
|
||||
if (itMime != codecMimeMap.end())
|
||||
{
|
||||
picture.mimeType = itMime->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
picture.mimeType = "application/octet-stream";
|
||||
LMS_LOG(MOD_AV, SEV_ERROR) << "CODEC ID " << avstream->codec->codec_id << " not handled in mime type conversion";
|
||||
}
|
||||
|
||||
AVPacket pkt = avstream->attached_pic;
|
||||
|
||||
std::copy(pkt.data, pkt.data + pkt.size, std::back_inserter(picture.data));
|
||||
|
||||
pictures.push_back( picture );
|
||||
|
||||
if (pictures.size() >= nbMaxPictures)
|
||||
break;
|
||||
}
|
||||
|
||||
return pictures;
|
||||
}
|
||||
|
||||
} // namespace Av
|
||||
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* This file contains some classes in order to get info from file using the libavconv */
|
||||
|
||||
#ifndef AV_INFO_HPP
|
||||
#define AV_INFO_HPP
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#define __STDC_CONSTANT_MACROS
|
||||
#include <libavcodec/avcodec.h>
|
||||
#include <libavformat/avformat.h>
|
||||
#include <libavutil/error.h>
|
||||
}
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
|
||||
#include <boost/filesystem/path.hpp>
|
||||
#include <boost/date_time/posix_time/posix_time_types.hpp> //no i/o just types
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
void AvInit();
|
||||
|
||||
struct Picture
|
||||
{
|
||||
std::string mimeType;
|
||||
std::vector<uint8_t> data;
|
||||
};
|
||||
|
||||
struct Stream
|
||||
{
|
||||
enum class Type
|
||||
{
|
||||
Audio,
|
||||
Video,
|
||||
Subtitle,
|
||||
};
|
||||
|
||||
int id;
|
||||
Type type;
|
||||
std::size_t bitrate;
|
||||
std::string desc; // Description of the stream
|
||||
};
|
||||
|
||||
class MediaFile
|
||||
{
|
||||
public:
|
||||
|
||||
MediaFile(const boost::filesystem::path& p);
|
||||
~MediaFile();
|
||||
|
||||
boost::filesystem::path getPath() const {return _p;};
|
||||
|
||||
bool open(void);
|
||||
bool scan(void);
|
||||
|
||||
boost::posix_time::time_duration getDuration() const;
|
||||
std::map<std::string, std::string> getMetaData(void);
|
||||
|
||||
std::vector<Stream> getStreams(Stream::Type type) const;
|
||||
int getBestStreamId(Stream::Type type) const; // -1 if failure/unknown
|
||||
bool hasAttachedPictures(void) const;
|
||||
std::vector<Picture> getAttachedPictures(std::size_t nbMaxPictures) const;
|
||||
|
||||
private:
|
||||
|
||||
boost::filesystem::path _p;
|
||||
AVFormatContext* _context;
|
||||
};
|
||||
|
||||
|
||||
} // namespace Av
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,255 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "logger/Logger.hpp"
|
||||
|
||||
#include "AvTranscoder.hpp"
|
||||
|
||||
namespace Av {
|
||||
|
||||
std::string encoding_to_mimetype(Encoding encoding)
|
||||
{
|
||||
switch(encoding)
|
||||
{
|
||||
case Encoding::MP3: return "audio/mp3";
|
||||
case Encoding::OGA: return "audio/ogg";
|
||||
case Encoding::OGV: return "video/ogg";
|
||||
case Encoding::WEBMA: return "audio/webm";
|
||||
case Encoding::WEBMV: return "video/webm";
|
||||
case Encoding::FLA: return "audio/x-flv";
|
||||
case Encoding::FLV: return "video/x-flv";
|
||||
case Encoding::M4A: return "audio/mp4";
|
||||
case Encoding::M4V: return "video/mp4";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
// TODO, parametrize?
|
||||
const std::vector<std::string> execNames =
|
||||
{
|
||||
"avconv",
|
||||
"ffmpeg",
|
||||
};
|
||||
|
||||
boost::mutex Transcoder::_mutex;
|
||||
|
||||
boost::filesystem::path Transcoder::_avConvPath = boost::filesystem::path();
|
||||
|
||||
void
|
||||
Transcoder::init()
|
||||
{
|
||||
for (std::string execName : execNames)
|
||||
{
|
||||
const boost::filesystem::path p = boost::process::search_path(execName);
|
||||
if (!p.empty())
|
||||
{
|
||||
_avConvPath = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!_avConvPath.empty())
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_INFO) << "Using transcoder " << _avConvPath;
|
||||
else
|
||||
throw std::runtime_error("Cannot find any transcoder binary!");
|
||||
}
|
||||
|
||||
|
||||
//boost::filesystem::path Transcoder::_avConvPath = "";
|
||||
|
||||
Transcoder::Transcoder(boost::filesystem::path filePath, TranscodeParameters parameters)
|
||||
: _filePath(filePath),
|
||||
_parameters(parameters),
|
||||
_outputPipe(boost::process::create_pipe()),
|
||||
_source(_outputPipe.source, boost::iostreams::close_handle),
|
||||
_is(_source),
|
||||
_in(&_is),
|
||||
_isComplete(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool
|
||||
Transcoder::start()
|
||||
{
|
||||
if (!boost::filesystem::exists(_filePath))
|
||||
return false;
|
||||
else if (!boost::filesystem::is_regular( _filePath) )
|
||||
return false;
|
||||
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_INFO) << "Transcoding file '" << _filePath << "'";
|
||||
|
||||
// Launch a process to handle the conversion
|
||||
boost::iostreams::file_descriptor_sink sink(_outputPipe.sink, boost::iostreams::close_handle);
|
||||
|
||||
std::ostringstream oss;
|
||||
|
||||
oss << _avConvPath;
|
||||
|
||||
// input Offset
|
||||
if (_parameters.getOffset().total_seconds() > 0)
|
||||
oss << " -ss " << _parameters.getOffset().total_seconds(); // to be placed before '-i' to speed up seeking?
|
||||
|
||||
// Input file
|
||||
oss << " -i " << _filePath;
|
||||
|
||||
// Output bitrates
|
||||
oss << " -b:a " << _parameters.getBitrate(Stream::Type::Audio) ;
|
||||
// if (_parameters.getOutputFormat().getType() == Format::Video)
|
||||
// oss << " -b:v " << _parameters.getOutputBitrate(Stream::Video);
|
||||
|
||||
// Stream mapping
|
||||
for (int streamId : _parameters.getSelectedStreamIds())
|
||||
{
|
||||
// 0 means the first input file
|
||||
oss << " -map 0:" << streamId;
|
||||
}
|
||||
|
||||
// Codecs and formats
|
||||
switch( _parameters.getEncoding())
|
||||
{
|
||||
case Encoding::MP3:
|
||||
oss << " -f mp3";
|
||||
break;
|
||||
case Encoding::OGA:
|
||||
oss << " -acodec libvorbis -f ogg";
|
||||
break;
|
||||
case Encoding::OGV:
|
||||
oss << " -acodec libvorbis -ac 2 -ar 44100 -vcodec libtheora -threads 4 -f ogg";
|
||||
break;
|
||||
case Encoding::WEBMA:
|
||||
oss << " -codec:a libvorbis -f webm";
|
||||
break;
|
||||
case Encoding::WEBMV:
|
||||
oss << " -acodec libvorbis -ac 2 -ar 44100 -vcodec libvpx -threads 4 -f webm";
|
||||
break;
|
||||
case Encoding::M4A:
|
||||
oss << " -acodec aac -f mp4 -strict experimental";
|
||||
break;
|
||||
case Encoding::M4V:
|
||||
oss << " -acodec aac -strict experimental -ac 2 -ar 44100 -vcodec libx264 -f m4v";
|
||||
break;
|
||||
case Encoding::FLV:
|
||||
oss << " -acodec libmp3lame -ac 2 -ar 44100 -vcodec libx264 -f flv";
|
||||
break;
|
||||
case Encoding::FLA:
|
||||
oss << " -acodec libmp3lame -f flv";
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
oss << " -"; // output to stdout
|
||||
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_DEBUG) << "Executing '" << oss.str() << "'";
|
||||
|
||||
// make sure only one thread is executing this part of code
|
||||
// See boost process FAQ
|
||||
{
|
||||
boost::lock_guard<boost::mutex> lock(_mutex);
|
||||
|
||||
_child = std::make_shared<boost::process::child>( boost::process::execute(
|
||||
boost::process::initializers::run_exe(_avConvPath),
|
||||
boost::process::initializers::set_cmd_line(oss.str()),
|
||||
boost::process::initializers::bind_stdout(sink),
|
||||
boost::process::initializers::close_fds_if([](int fd) { return fd != STDOUT_FILENO;})
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
Transcoder::process(std::vector<unsigned char>& output, std::size_t maxSize)
|
||||
{
|
||||
std::size_t readDataSize = 0;
|
||||
|
||||
if (_isComplete)
|
||||
return;
|
||||
|
||||
char ch;
|
||||
while(readDataSize < maxSize && _in && _in.get(ch)) {
|
||||
output.push_back(ch);
|
||||
readDataSize++;
|
||||
}
|
||||
|
||||
if (!_in || _in.fail() || _in.eof()) {
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_DEBUG) << "Transcode complete!";
|
||||
|
||||
waitChild();
|
||||
_isComplete = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Transcoder::~Transcoder()
|
||||
{
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_DEBUG) << "~Transcoder called!";
|
||||
|
||||
if (_in.eof())
|
||||
waitChild();
|
||||
else
|
||||
killChild();
|
||||
}
|
||||
|
||||
void
|
||||
Transcoder::waitChild()
|
||||
{
|
||||
if (_child)
|
||||
{
|
||||
boost::system::error_code ec;
|
||||
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_DEBUG) << "Waiting for child...";
|
||||
boost::process::wait_for_exit(*_child, ec);
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_DEBUG) << "Waiting for child: OK";
|
||||
|
||||
if (ec)
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_ERROR) << "Transcoder::waitChild: error: " << ec.message();
|
||||
|
||||
_child.reset();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Transcoder::killChild()
|
||||
{
|
||||
if (_child)
|
||||
{
|
||||
boost::system::error_code ec;
|
||||
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_DEBUG) << "Killing child! pid = " << _child->pid;
|
||||
boost::process::terminate(*_child, ec);
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_DEBUG) << "Killing child DONE";
|
||||
|
||||
// If an error occured, force kill the child
|
||||
if (ec)
|
||||
LMS_LOG(MOD_TRANSCODE, SEV_ERROR) << "Transcoder::killChild: error: " << ec.message();
|
||||
|
||||
_child.reset();
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
Transcoder::isComplete(void)
|
||||
{
|
||||
return _isComplete;
|
||||
}
|
||||
|
||||
} // namespace Transcode
|
||||
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <iostream>
|
||||
|
||||
#include <boost/iostreams/stream.hpp>
|
||||
#include <boost/process.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
|
||||
#include <boost/date_time/posix_time/posix_time_types.hpp> //no i/o just types
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
#include "AvInfo.hpp"
|
||||
|
||||
namespace Av {
|
||||
|
||||
|
||||
enum class Encoding
|
||||
{
|
||||
OGA,
|
||||
OGV,
|
||||
MP3,
|
||||
WEBMA,
|
||||
WEBMV,
|
||||
FLA,
|
||||
FLV,
|
||||
M4A,
|
||||
M4V,
|
||||
};
|
||||
|
||||
std::string encoding_to_mimetype(Encoding encoding);
|
||||
|
||||
class TranscodeParameters
|
||||
{
|
||||
public:
|
||||
|
||||
// Setters
|
||||
void setEncoding(Encoding encoding) { _encoding = encoding; }
|
||||
void setOffset(boost::posix_time::time_duration offset) {_offset = offset; }
|
||||
void setBitrate(Stream::Type type, std::size_t bitrate) { _outputBitrate[type] = bitrate; }
|
||||
|
||||
// Manually add the streams to be transcoded
|
||||
// If no stream is added, input streams are selected automatically
|
||||
void addStream(int inputStreamId) { _selectedStreams.insert(inputStreamId); }
|
||||
|
||||
// Getters
|
||||
Encoding getEncoding(void) const { return _encoding; }
|
||||
boost::posix_time::time_duration getOffset(void) const { return _offset; }
|
||||
std::set<int> getSelectedStreamIds(void) const { return _selectedStreams; }
|
||||
std::size_t getBitrate(Stream::Type type) { return _outputBitrate[type]; }
|
||||
|
||||
private:
|
||||
Encoding _encoding = Encoding::MP3;
|
||||
boost::posix_time::time_duration _offset = boost::posix_time::seconds(0);
|
||||
std::set<int> _selectedStreams;
|
||||
std::map<Stream::Type, std::size_t> _outputBitrate = { {Stream::Type::Audio, 0}, { Stream::Type::Video, 0}, { Stream::Type::Subtitle, 0} };
|
||||
};
|
||||
|
||||
|
||||
class Transcoder
|
||||
{
|
||||
public:
|
||||
static void init();
|
||||
|
||||
Transcoder(boost::filesystem::path file, TranscodeParameters parameters);
|
||||
~Transcoder();
|
||||
|
||||
bool start();
|
||||
void process(std::vector<unsigned char>& output, std::size_t maxSize);
|
||||
bool isComplete(void);
|
||||
|
||||
private:
|
||||
|
||||
boost::filesystem::path _filePath;
|
||||
TranscodeParameters _parameters;
|
||||
|
||||
static boost::mutex _mutex;
|
||||
|
||||
boost::process::pipe _outputPipe;
|
||||
boost::iostreams::file_descriptor_source _source;
|
||||
boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_source> _is;
|
||||
std::istream _in;
|
||||
|
||||
void waitChild();
|
||||
void killChild();
|
||||
|
||||
std::shared_ptr<boost::process::child> _child;
|
||||
|
||||
static boost::filesystem::path _avConvPath;
|
||||
bool _isComplete;
|
||||
|
||||
};
|
||||
|
||||
} // namespace Av
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <cassert>
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
|
||||
#include "logger/Logger.hpp"
|
||||
|
||||
#include "Codec.hpp"
|
||||
|
||||
Codec::Codec(enum CodecID codec, Type type )
|
||||
: _codec(nullptr)
|
||||
{
|
||||
if (type == Encoder)
|
||||
_codec = avcodec_find_encoder(codec);
|
||||
else if (type == Decoder)
|
||||
_codec = avcodec_find_decoder(codec);
|
||||
|
||||
if (_codec == nullptr) {
|
||||
LMS_LOG(MOD_AV, SEV_ERROR) << "Codec constructor failed! codec = " << codec << ", type = " << type;
|
||||
throw std::runtime_error("can't find codec using this id!");
|
||||
}
|
||||
}
|
||||
|
||||
Codec::Codec(const AVCodec* codec)
|
||||
: _codec(codec)
|
||||
{
|
||||
assert(_codec != nullptr);
|
||||
}
|
||||
|
||||
Codec::~Codec()
|
||||
{
|
||||
if (_codec == nullptr) {
|
||||
// TODO release iif ownership has not been taken?
|
||||
// av_codec_close(_codec);
|
||||
}
|
||||
}
|
||||
|
||||
const AVCodec*
|
||||
Codec::get() const
|
||||
{
|
||||
assert(_codec != nullptr);
|
||||
return _codec;
|
||||
}
|
||||
|
||||
Codec::Id
|
||||
Codec::getId() const
|
||||
{
|
||||
assert(_codec != nullptr);
|
||||
return _codec->id;
|
||||
}
|
||||
|
||||
std::string
|
||||
Codec::getName() const
|
||||
{
|
||||
assert(_codec != nullptr);
|
||||
return _codec->name;
|
||||
}
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CODEC_HPP__
|
||||
#define CODEC_HPP__
|
||||
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <boost/utility.hpp>
|
||||
|
||||
#include "Common.hpp"
|
||||
|
||||
class Codec : boost::noncopyable
|
||||
{
|
||||
friend class CodecContext;
|
||||
friend class FormatContext;
|
||||
friend class OutputFormatContext;
|
||||
|
||||
public:
|
||||
|
||||
typedef enum AVCodecID Id;
|
||||
enum Type {
|
||||
Encoder,
|
||||
Decoder,
|
||||
};
|
||||
|
||||
Codec(Id codecId, Type type);
|
||||
Codec(const AVCodec* codec); // Attach existing codec
|
||||
~Codec();
|
||||
|
||||
Id getId() const;
|
||||
std::string getName() const;
|
||||
|
||||
private:
|
||||
|
||||
const AVCodec* get() const;
|
||||
const AVCodec* _codec;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <boost/array.hpp>
|
||||
|
||||
#include "CodecContext.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
CodecContext::CodecContext(AVCodecContext* CodecContext)
|
||||
: _codecContext(CodecContext)
|
||||
{
|
||||
assert(_codecContext != nullptr);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CodecContext::dumpInfo(std::ostream& ost) const
|
||||
{
|
||||
ost << "BitRate = " << getBitRate() << ", SampleFormat = " << getSampleFormat() << ", SampleRate = " << getSampleRate() << ", ChannelLayout = " << getChannelLayout() << ", NbChannels = " << getNbChannels() << ", Timebase = " << getTimeBase().num << "/" << getTimeBase().den;
|
||||
}
|
||||
|
||||
|
||||
std::string
|
||||
CodecContext::getCodecDesc(void) const
|
||||
{
|
||||
std::array<char, 256> buf;
|
||||
avcodec_string(buf.data(), buf.size(), _codecContext, 0);
|
||||
|
||||
return std::string(buf.data());
|
||||
}
|
||||
|
||||
} // namespace Av
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CODEC_CONTEXT_HPP
|
||||
#define CODEC_CONTEXT_HPP
|
||||
|
||||
#include <boost/utility.hpp>
|
||||
#include <iostream>
|
||||
|
||||
#include "Codec.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
class CodecContext
|
||||
{
|
||||
public:
|
||||
|
||||
CodecContext(AVCodecContext* CodecContext); // Attach existing codec context (no free will be done)
|
||||
|
||||
// Codec getCodec();
|
||||
|
||||
enum AVMediaType getType(void) const { return _codecContext->codec_type; }
|
||||
Codec::Id getCodecId(void) const { return _codecContext->codec_id; }
|
||||
|
||||
std::string getCodecDesc(void) const;
|
||||
|
||||
// Accessors
|
||||
std::size_t getBitRate() const {return _codecContext->bit_rate;}
|
||||
AVSampleFormat getSampleFormat() const {return _codecContext->sample_fmt;}
|
||||
std::size_t getSampleRate() const {return _codecContext->sample_rate;}
|
||||
std::uint64_t getChannelLayout() const {return _codecContext->channel_layout;}
|
||||
std::size_t getNbChannels() const {return _codecContext->channels; }
|
||||
AVRational getTimeBase() const {return _codecContext->time_base; }
|
||||
|
||||
void dumpInfo(std::ostream& ost) const;
|
||||
|
||||
private:
|
||||
AVCodecContext* native() { return _codecContext; }
|
||||
|
||||
AVCodecContext* _codecContext;
|
||||
};
|
||||
|
||||
} // namespace Av
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <boost/array.hpp>
|
||||
|
||||
#include "logger/Logger.hpp"
|
||||
|
||||
#include "Common.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
std::string
|
||||
AvError::to_str(void) const
|
||||
{
|
||||
boost::array<char, 128> buf = {0};
|
||||
if (av_strerror(_errnum, buf.data(), buf.size()) == 0)
|
||||
return std::string(&buf[0]);
|
||||
else
|
||||
return "Unknown error";
|
||||
|
||||
}
|
||||
|
||||
|
||||
std::ostream& operator<<(std::ostream& ost, const AvError& err)
|
||||
{
|
||||
ost << err.to_str();
|
||||
return ost;
|
||||
}
|
||||
|
||||
void AvInit()
|
||||
{
|
||||
/* register all the codecs */
|
||||
avcodec_register_all();
|
||||
av_register_all();
|
||||
LMS_LOG(MOD_AV, SEV_INFO) << "avcodec version = " << avcodec_version();
|
||||
}
|
||||
|
||||
} // namespace Av
|
||||
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef TRANSCODE_COMMON_HPP__
|
||||
#define TRANSCODE_COMMON_HPP__
|
||||
|
||||
// Hack to properly iinclude libavcodec/avcodec.h...
|
||||
//
|
||||
#define __STDC_CONSTANT_MACROS
|
||||
#ifdef _STDINT_H
|
||||
#undef _STDINT_H
|
||||
#endif
|
||||
# include <stdint.h>
|
||||
extern "C" {
|
||||
#include <libavcodec/avcodec.h>
|
||||
#include <libavformat/avformat.h>
|
||||
#include <libavutil/channel_layout.h>
|
||||
#include <libavutil/mathematics.h>
|
||||
}
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
|
||||
void AvInit();
|
||||
|
||||
class AvError
|
||||
{
|
||||
public:
|
||||
AvError() : _errnum(0) {}
|
||||
AvError(int ernum) : _errnum(ernum) {}
|
||||
|
||||
void operator=(int errnum) { _errnum = errnum; }
|
||||
|
||||
operator bool() { return _errnum < 0; }
|
||||
|
||||
std::string to_str() const;
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& ost, const AvError&);
|
||||
|
||||
bool eof() { return _errnum == AVERROR_EOF; } // TODO
|
||||
|
||||
private:
|
||||
int _errnum;
|
||||
};
|
||||
|
||||
} // namespace Av
|
||||
|
||||
#endif
|
||||
@@ -1,50 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "Dictionary.hpp"
|
||||
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
Dictionary::Dictionary(AVDictionary* dictionary)
|
||||
: _dictionary(dictionary)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
Dictionary::get(std::map<std::string, std::string>& entries)
|
||||
{
|
||||
AVDictionaryEntry *tag = NULL;
|
||||
while ((tag = av_dict_get(_dictionary, "", tag, AV_DICT_IGNORE_SUFFIX))) {
|
||||
entries.insert( std::make_pair(tag->key, tag->value));
|
||||
}
|
||||
}
|
||||
|
||||
std::string
|
||||
Dictionary::get(std::string key)
|
||||
{
|
||||
AVDictionaryEntry *tag = NULL;
|
||||
tag = av_dict_get(_dictionary, key.c_str(), tag, 0);
|
||||
|
||||
return tag != NULL ? std::string(tag->value) : std::string();
|
||||
}
|
||||
|
||||
} // namespace Av
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef AV_DICTIONARY_HPP
|
||||
#define AV_DICTIONARY_HPP
|
||||
|
||||
#include <map>
|
||||
#include "Common.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
class Dictionary
|
||||
{
|
||||
public:
|
||||
Dictionary(AVDictionary* dictionary);
|
||||
|
||||
// Get all
|
||||
void get(std::map<std::string, std::string>& entries);
|
||||
|
||||
// get a single entry
|
||||
std::string get(std::string key);
|
||||
|
||||
private:
|
||||
AVDictionary* _dictionary;
|
||||
};
|
||||
|
||||
} // namespace Av
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include "FormatContext.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
FormatContext::FormatContext()
|
||||
: _context(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
FormatContext::~FormatContext()
|
||||
{
|
||||
}
|
||||
|
||||
} // namespace Av
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef FORMAT_CONTEXT_HPP
|
||||
#define FORMAT_CONTEXT_HPP
|
||||
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include "Common.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
class FormatContext
|
||||
{
|
||||
public:
|
||||
FormatContext();
|
||||
~FormatContext();
|
||||
|
||||
|
||||
protected:
|
||||
void native(AVFormatContext* c) { _context = c;}
|
||||
AVFormatContext* native() { return _context; }
|
||||
const AVFormatContext* native() const { return _context; }
|
||||
|
||||
private:
|
||||
|
||||
AVFormatContext* _context;
|
||||
|
||||
|
||||
};
|
||||
|
||||
} // namespace Av
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,176 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
|
||||
#include "logger/Logger.hpp"
|
||||
|
||||
#include "InputFormatContext.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
InputFormatContext::InputFormatContext(const boost::filesystem::path& p)
|
||||
: _path(p)
|
||||
{
|
||||
AVFormatContext* context = nullptr;
|
||||
|
||||
// The last three parameters specify the file format, buffer size and
|
||||
// format parameters. By simply specifying NULL or 0 we ask libavformat
|
||||
// to auto-detect the format and use a default buffer size.
|
||||
AvError error = avformat_open_input(&context, p.string().c_str(), nullptr, nullptr);
|
||||
if (error)
|
||||
{
|
||||
LMS_LOG(MOD_AV, SEV_ERROR) << "Cannot open '" << p.string() << "', avformat_open_input returned " << error;
|
||||
throw std::runtime_error("avformat_open_input failed: " + error.to_str());
|
||||
}
|
||||
|
||||
native(context);
|
||||
|
||||
}
|
||||
|
||||
InputFormatContext::~InputFormatContext()
|
||||
{
|
||||
AVFormatContext* context = native();
|
||||
avformat_close_input(&context);
|
||||
}
|
||||
|
||||
std::vector<Stream>
|
||||
InputFormatContext::getStreams(void)
|
||||
{
|
||||
std::vector<Stream> res;
|
||||
|
||||
for (std::size_t i = 0; i < native()->nb_streams; ++i) {
|
||||
res.push_back( Stream(native()->streams[i]));
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
InputFormatContext::getBestStreamIdx(AVMediaType type, Stream::Idx& index)
|
||||
{
|
||||
int res = av_find_best_stream(native(),
|
||||
type,
|
||||
-1, // Auto
|
||||
-1, // Auto
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
||||
AvError error(res);
|
||||
if (error) {
|
||||
LMS_LOG(MOD_AV, SEV_DEBUG) << "Cannot get best stream for type " << type << ": " << error;
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
index = res;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
InputFormatContext::findStreamInfo(void)
|
||||
{
|
||||
AvError err = avformat_find_stream_info(native(), NULL);
|
||||
if (err)
|
||||
{
|
||||
LMS_LOG(MOD_AV, SEV_ERROR) << "Couldn't find stream information: " << err;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
std::size_t
|
||||
InputFormatContext::getDurationSecs() const
|
||||
{
|
||||
if (static_cast<int>(native()->duration) != AV_NOPTS_VALUE )
|
||||
return native()->duration / AV_TIME_BASE;
|
||||
else
|
||||
return 0; // TODO, do something better?
|
||||
}
|
||||
|
||||
Dictionary
|
||||
InputFormatContext::getMetadata(void)
|
||||
{
|
||||
return Dictionary(native()->metadata);
|
||||
|
||||
}
|
||||
|
||||
std::size_t
|
||||
InputFormatContext::getNbPictures(void) const
|
||||
{
|
||||
std::size_t res = 0;
|
||||
|
||||
for (std::size_t i = 0; i < native()->nb_streams; ++i)
|
||||
{
|
||||
if (native()->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC)
|
||||
++res;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
std::vector<Picture>
|
||||
InputFormatContext::getPictures(std::size_t nbMaxPictures) const
|
||||
{
|
||||
static const std::map<int, std::string> codecMimeMap =
|
||||
{
|
||||
{ AV_CODEC_ID_BMP, "image/x-bmp" },
|
||||
{ AV_CODEC_ID_GIF, "image/gif" },
|
||||
{ AV_CODEC_ID_MJPEG, "image/jpeg" },
|
||||
{ AV_CODEC_ID_PNG, "image/png" },
|
||||
{ AV_CODEC_ID_PNG, "image/x-png" },
|
||||
{ AV_CODEC_ID_PPM, "image/x-portable-pixmap" },
|
||||
};
|
||||
|
||||
std::vector<Picture> pictures;
|
||||
|
||||
for (std::size_t i = 0; i < native()->nb_streams; ++i)
|
||||
{
|
||||
Stream stream(native()->streams[i]);
|
||||
|
||||
if (stream.hasAttachedPic())
|
||||
{
|
||||
Picture picture;
|
||||
|
||||
auto itMime = codecMimeMap.find(stream.getCodecContext().getCodecId());
|
||||
if (itMime != codecMimeMap.end())
|
||||
picture.mimeType = itMime->second;
|
||||
else
|
||||
picture.mimeType = "application/octet-stream";
|
||||
|
||||
AVPacket pkt = native()->streams[i]->attached_pic;
|
||||
|
||||
std::copy(pkt.data, pkt.data + pkt.size, std::back_inserter(picture.data));
|
||||
|
||||
pictures.push_back( picture );
|
||||
|
||||
if (pictures.size() >= nbMaxPictures)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return pictures;
|
||||
}
|
||||
|
||||
} //namespace Av
|
||||
@@ -1,72 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef INPUT_FORMAT_CONTEXT_HPP
|
||||
#define INPUT_FORMAT_CONTEXT_HPP
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include "FormatContext.hpp"
|
||||
#include "Stream.hpp"
|
||||
#include "Dictionary.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
struct Picture {
|
||||
std::string mimeType;
|
||||
std::vector<unsigned char> data;
|
||||
};
|
||||
|
||||
class InputFormatContext : public FormatContext
|
||||
{
|
||||
public:
|
||||
|
||||
InputFormatContext(const boost::filesystem::path& p);
|
||||
~InputFormatContext();
|
||||
|
||||
|
||||
Dictionary getMetadata(void); // metadata access
|
||||
|
||||
// Scan file
|
||||
bool findStreamInfo();
|
||||
|
||||
|
||||
// Get attached pictures
|
||||
std::size_t getNbPictures(void) const;
|
||||
std::vector<Picture> getPictures(std::size_t nbMaxPictures) const;
|
||||
|
||||
// Get the streams
|
||||
std::vector<Stream> getStreams(void);
|
||||
|
||||
bool getBestStreamIdx(enum AVMediaType type, Stream::Idx& idx);
|
||||
std::size_t getDurationSecs() const;
|
||||
|
||||
private:
|
||||
boost::filesystem::path _path;
|
||||
|
||||
|
||||
};
|
||||
|
||||
} // namespace av
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <cassert>
|
||||
#include "Stream.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
Stream::Stream(AVStream* stream)
|
||||
: _stream(stream)
|
||||
{
|
||||
assert(_stream != nullptr);
|
||||
assert(_stream->codec != nullptr);
|
||||
}
|
||||
|
||||
CodecContext
|
||||
Stream::getCodecContext()
|
||||
{
|
||||
return _stream->codec;
|
||||
}
|
||||
|
||||
Dictionary
|
||||
Stream::getMetadata(void)
|
||||
{
|
||||
return Dictionary(_stream->metadata);
|
||||
}
|
||||
|
||||
bool
|
||||
Stream::hasAttachedPic(void) const
|
||||
{
|
||||
return (_stream->disposition & AV_DISPOSITION_ATTACHED_PIC);
|
||||
}
|
||||
|
||||
} // namespace Av
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS 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 LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef STREAM_HPP__
|
||||
#define STREAM_HPP__
|
||||
|
||||
#include "Common.hpp"
|
||||
|
||||
#include "CodecContext.hpp"
|
||||
#include "Dictionary.hpp"
|
||||
|
||||
namespace Av
|
||||
{
|
||||
|
||||
class Stream
|
||||
{
|
||||
friend class InputFormatContext;
|
||||
|
||||
public:
|
||||
// Attach existing stream
|
||||
Stream(AVStream* stream);
|
||||
|
||||
typedef size_t Idx;
|
||||
|
||||
// Idx getIdx() const { return _stream->index; }
|
||||
|
||||
bool hasAttachedPic(void) const;
|
||||
Dictionary getMetadata(void);
|
||||
CodecContext getCodecContext(void);
|
||||
|
||||
private:
|
||||
|
||||
AVStream* _stream;
|
||||
};
|
||||
|
||||
} // namespace Av
|
||||
|
||||
#endif
|
||||
|
||||
+204
@@ -0,0 +1,204 @@
|
||||
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
|
||||
!_TAG_FILE_SORTED 2 /0=unsorted, 1=sorted, 2=foldcase/
|
||||
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
|
||||
!_TAG_PROGRAM_NAME Exuberant Ctags //
|
||||
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
|
||||
!_TAG_PROGRAM_VERSION 5.9~svn20110310 //
|
||||
addStream /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void addStream(int inputStreamId);$/;" p language:C++ class:Av::TranscodeParameters
|
||||
Audio /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ Audio,$/;" m language:C++ class:Av::Stream::Type
|
||||
Av /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^namespace Av {$/;" n language:C++ file:
|
||||
Av /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^namespace Av$/;" n language:C++
|
||||
Av /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^namespace Av {$/;" n language:C++ file:
|
||||
Av /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^namespace Av {$/;" n language:C++
|
||||
Av::averror_to_string /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^static std::string averror_to_string(int error)$/;" f language:C++ namespace:Av
|
||||
Av::AvInit /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^void AvInit()$/;" f language:C++ namespace:Av
|
||||
Av::AvInit /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^void AvInit();$/;" p language:C++ namespace:Av
|
||||
Av::Encoding /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^enum class Encoding$/;" c language:C++ namespace:Av
|
||||
Av::Encoding::FLA /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ FLA,$/;" m language:C++ class:Av::Encoding
|
||||
Av::Encoding::FLV /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ FLV,$/;" m language:C++ class:Av::Encoding
|
||||
Av::Encoding::M4A /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ M4A,$/;" m language:C++ class:Av::Encoding
|
||||
Av::Encoding::M4V /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ M4V,$/;" m language:C++ class:Av::Encoding
|
||||
Av::Encoding::MP3 /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ MP3,$/;" m language:C++ class:Av::Encoding
|
||||
Av::Encoding::OGA /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ OGA,$/;" m language:C++ class:Av::Encoding
|
||||
Av::Encoding::OGV /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ OGV,$/;" m language:C++ class:Av::Encoding
|
||||
Av::Encoding::WEBMA /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ WEBMA,$/;" m language:C++ class:Av::Encoding
|
||||
Av::Encoding::WEBMV /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ WEBMV,$/;" m language:C++ class:Av::Encoding
|
||||
Av::encoding_to_mimetype /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^std::string encoding_to_mimetype(Encoding encoding)$/;" f language:C++ namespace:Av
|
||||
Av::encoding_to_mimetype /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^std::string encoding_to_mimetype(Encoding encoding);$/;" p language:C++ namespace:Av
|
||||
Av::execNames /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^const std::vector<std::string> execNames =$/;" m language:C++ namespace:Av file:
|
||||
Av::getMetaDataFromDictionnary /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^getMetaDataFromDictionnary(AVDictionary* dictionnary, std::map<std::string, std::string>& res)$/;" f language:C++ namespace:Av
|
||||
Av::MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^class MediaFile$/;" c language:C++ namespace:Av
|
||||
Av::MediaFile::getAttachedPictures /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getAttachedPictures(std::size_t nbMaxPictures) const$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getAttachedPictures /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::vector<Picture> getAttachedPictures(std::size_t nbMaxPictures) const;$/;" p language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getBestStreamId /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getBestStreamId(Stream::Type type) const$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getBestStreamId /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ int getBestStreamId(Stream::Type type) const; \/\/ -1 if failure\/unknown$/;" p language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getDuration /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getDuration() const$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getDuration /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ boost::posix_time::time_duration getDuration() const;$/;" p language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getMetaData /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getMetaData(void)$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getMetaData /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::map<std::string, std::string> getMetaData(void);$/;" p language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getPath /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ boost::filesystem::path getPath() const {return _p;};$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getStreams /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getStreams(Stream::Type type) const$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::getStreams /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::vector<Stream> getStreams(Stream::Type type) const;$/;" p language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::hasAttachedPictures /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::hasAttachedPictures(void) const$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::hasAttachedPictures /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ bool hasAttachedPictures(void) const;$/;" p language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::MediaFile(const boost::filesystem::path& p)$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ MediaFile(const boost::filesystem::path& p);$/;" p language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::open /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::open(void)$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::open /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ bool open(void);$/;" p language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::scan /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::scan(void)$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::scan /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ bool scan(void);$/;" p language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::_context /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ AVFormatContext* _context;$/;" m language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::_p /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ boost::filesystem::path _p;$/;" m language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::~MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::~MediaFile()$/;" f language:C++ class:Av::MediaFile
|
||||
Av::MediaFile::~MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ ~MediaFile();$/;" p language:C++ class:Av::MediaFile
|
||||
Av::Picture /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^struct Picture$/;" s language:C++ namespace:Av
|
||||
Av::Picture::data /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::vector<uint8_t> data;$/;" m language:C++ struct:Av::Picture
|
||||
Av::Picture::mimeType /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::string mimeType;$/;" m language:C++ struct:Av::Picture
|
||||
Av::Stream /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^struct Stream$/;" s language:C++ namespace:Av
|
||||
Av::Stream::bitrate /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::size_t bitrate;$/;" m language:C++ struct:Av::Stream
|
||||
Av::Stream::desc /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::string desc; \/\/ Description of the stream$/;" m language:C++ struct:Av::Stream
|
||||
Av::Stream::id /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ int id;$/;" m language:C++ struct:Av::Stream
|
||||
Av::Stream::Type /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ enum class Type$/;" c language:C++ struct:Av::Stream
|
||||
Av::Stream::type /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ Type type;$/;" m language:C++ struct:Av::Stream
|
||||
Av::Stream::Type::Audio /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ Audio,$/;" m language:C++ class:Av::Stream::Type
|
||||
Av::Stream::Type::Subtitle /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ Subtitle,$/;" m language:C++ class:Av::Stream::Type
|
||||
Av::Stream::Type::Video /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ Video,$/;" m language:C++ class:Av::Stream::Type
|
||||
Av::streamType_to_string /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^static std::string streamType_to_string(Stream::Type type)$/;" f language:C++ namespace:Av
|
||||
Av::TranscodeParameters /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^class TranscodeParameters$/;" c language:C++ namespace:Av
|
||||
Av::TranscodeParameters::addStream /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void addStream(int inputStreamId);$/;" p language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::getBitrate /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::size_t getBitrate(Stream::Type type) { return _outputBitrate[type]; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::getEncoding /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ Encoding getEncoding(void) const { return _encoding; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::getFile /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::filesystem::path getFile(void) const { return _path; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::getOffset /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::posix_time::time_duration getOffset(void) const { return _offset; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::getSelectedStreamIds /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::vector<int> getSelectedStreamIds(void) const { return _selectedStreams; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::setBitrate /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void setBitrate(Stream::Type type, std::size_t bitrate) { _outputBitrate[type] = bitrate; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::setEncoding /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void setEncoding(Encoding encoding) { _encoding = encoding; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::setFile /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void setFile(boost::filesystem::path p) {_path = p; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::setOffset /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void setOffset(boost::posix_time::time_duration offset) {_offset = offset; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::_encoding /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ Encoding _encoding = Encoding::MP3;$/;" m language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::_offset /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::posix_time::time_duration _offset = boost::posix_time::seconds(0);$/;" m language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::_outputBitrate /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::map<Stream::Type, std::size_t> _outputBitrate = { {Stream::Type::Audio, 0}, { Stream::Type::Video, 0}, { Stream::Type::Subtitle, 0} };$/;" m language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::_path /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::filesystem::path _path;$/;" m language:C++ class:Av::TranscodeParameters
|
||||
Av::TranscodeParameters::_selectedStreams /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::vector<int> _selectedStreams;$/;" m language:C++ class:Av::TranscodeParameters
|
||||
Av::Transcoder /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^class Transcoder$/;" c language:C++ namespace:Av
|
||||
Av::Transcoder::init /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::init()$/;" f language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::init /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ static void init();$/;" p language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::isComplete /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ bool isComplete(void);$/;" p language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::killChild /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::killChild()$/;" f language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::killChild /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void killChild();$/;" p language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::process /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::process(std::vector<unsigned char>& output, std::size_t maxSize)$/;" f language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::process /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void process(std::vector<unsigned char>& output, std::size_t maxSize);$/;" p language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::start /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::start()$/;" f language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::start /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ bool start();$/;" p language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::Transcoder /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::Transcoder(TrasncodeParameters parameters)$/;" f language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::Transcoder /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ Transcoder(TranscodeParameters parameters);$/;" p language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::waitChild /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::waitChild()$/;" f language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::waitChild /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void waitChild();$/;" p language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::_avConvPath /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^boost::filesystem::path Transcoder::_avConvPath = boost::filesystem::path();$/;" m language:C++ class:Av::Transcoder file:
|
||||
Av::Transcoder::_avConvPath /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ static boost::filesystem::path _avConvPath;$/;" m language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::_child /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::shared_ptr<boost::process::child> _child;$/;" m language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::_in /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::istream _in;$/;" m language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::_is /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_source> _is;$/;" m language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::_isComplete /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ bool _isComplete;$/;" m language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::_mutex /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^boost::mutex Transcoder::_mutex;$/;" m language:C++ class:Av::Transcoder file:
|
||||
Av::Transcoder::_mutex /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ static boost::mutex _mutex;$/;" m language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::_outputPipe /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::process::pipe _outputPipe;$/;" m language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::_parameters /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ TranscodeParameters _parameters;$/;" m language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::_source /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::iostreams::file_descriptor_source _source;$/;" m language:C++ class:Av::Transcoder
|
||||
Av::Transcoder::~Transcoder /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::~Transcoder()$/;" f language:C++ class:Av::Transcoder
|
||||
averror_to_string /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^static std::string averror_to_string(int error)$/;" f language:C++ namespace:Av
|
||||
AvInit /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^void AvInit()$/;" f language:C++ namespace:Av
|
||||
AvInit /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^void AvInit();$/;" p language:C++ namespace:Av
|
||||
AV_INFO_HPP /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp 23;" d language:C++
|
||||
bitrate /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::size_t bitrate;$/;" m language:C++ struct:Av::Stream
|
||||
data /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::vector<uint8_t> data;$/;" m language:C++ struct:Av::Picture
|
||||
desc /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::string desc; \/\/ Description of the stream$/;" m language:C++ struct:Av::Stream
|
||||
Encoding /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^enum class Encoding$/;" c language:C++ namespace:Av
|
||||
encoding_to_mimetype /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^std::string encoding_to_mimetype(Encoding encoding)$/;" f language:C++ namespace:Av
|
||||
encoding_to_mimetype /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^std::string encoding_to_mimetype(Encoding encoding);$/;" p language:C++ namespace:Av
|
||||
execNames /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^const std::vector<std::string> execNames =$/;" m language:C++ namespace:Av file:
|
||||
FLA /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ FLA,$/;" m language:C++ class:Av::Encoding
|
||||
FLV /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ FLV,$/;" m language:C++ class:Av::Encoding
|
||||
getAttachedPictures /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getAttachedPictures(std::size_t nbMaxPictures) const$/;" f language:C++ class:Av::MediaFile
|
||||
getAttachedPictures /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::vector<Picture> getAttachedPictures(std::size_t nbMaxPictures) const;$/;" p language:C++ class:Av::MediaFile
|
||||
getBestStreamId /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getBestStreamId(Stream::Type type) const$/;" f language:C++ class:Av::MediaFile
|
||||
getBestStreamId /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ int getBestStreamId(Stream::Type type) const; \/\/ -1 if failure\/unknown$/;" p language:C++ class:Av::MediaFile
|
||||
getBitrate /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::size_t getBitrate(Stream::Type type) { return _outputBitrate[type]; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
getDuration /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getDuration() const$/;" f language:C++ class:Av::MediaFile
|
||||
getDuration /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ boost::posix_time::time_duration getDuration() const;$/;" p language:C++ class:Av::MediaFile
|
||||
getEncoding /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ Encoding getEncoding(void) const { return _encoding; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
getFile /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::filesystem::path getFile(void) const { return _path; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
getMetaData /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getMetaData(void)$/;" f language:C++ class:Av::MediaFile
|
||||
getMetaData /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::map<std::string, std::string> getMetaData(void);$/;" p language:C++ class:Av::MediaFile
|
||||
getMetaDataFromDictionnary /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^getMetaDataFromDictionnary(AVDictionary* dictionnary, std::map<std::string, std::string>& res)$/;" f language:C++ namespace:Av
|
||||
getOffset /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::posix_time::time_duration getOffset(void) const { return _offset; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
getPath /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ boost::filesystem::path getPath() const {return _p;};$/;" f language:C++ class:Av::MediaFile
|
||||
getSelectedStreamIds /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::vector<int> getSelectedStreamIds(void) const { return _selectedStreams; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
getStreams /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::getStreams(Stream::Type type) const$/;" f language:C++ class:Av::MediaFile
|
||||
getStreams /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::vector<Stream> getStreams(Stream::Type type) const;$/;" p language:C++ class:Av::MediaFile
|
||||
hasAttachedPictures /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::hasAttachedPictures(void) const$/;" f language:C++ class:Av::MediaFile
|
||||
hasAttachedPictures /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ bool hasAttachedPictures(void) const;$/;" p language:C++ class:Av::MediaFile
|
||||
id /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ int id;$/;" m language:C++ struct:Av::Stream
|
||||
init /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::init()$/;" f language:C++ class:Av::Transcoder
|
||||
init /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ static void init();$/;" p language:C++ class:Av::Transcoder
|
||||
isComplete /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ bool isComplete(void);$/;" p language:C++ class:Av::Transcoder
|
||||
killChild /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::killChild()$/;" f language:C++ class:Av::Transcoder
|
||||
killChild /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void killChild();$/;" p language:C++ class:Av::Transcoder
|
||||
M4A /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ M4A,$/;" m language:C++ class:Av::Encoding
|
||||
M4V /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ M4V,$/;" m language:C++ class:Av::Encoding
|
||||
MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::MediaFile(const boost::filesystem::path& p)$/;" f language:C++ class:Av::MediaFile
|
||||
MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ MediaFile(const boost::filesystem::path& p);$/;" p language:C++ class:Av::MediaFile
|
||||
MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^class MediaFile$/;" c language:C++ namespace:Av
|
||||
mimeType /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ std::string mimeType;$/;" m language:C++ struct:Av::Picture
|
||||
MP3 /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ MP3,$/;" m language:C++ class:Av::Encoding
|
||||
OGA /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ OGA,$/;" m language:C++ class:Av::Encoding
|
||||
OGV /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ OGV,$/;" m language:C++ class:Av::Encoding
|
||||
open /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::open(void)$/;" f language:C++ class:Av::MediaFile
|
||||
open /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ bool open(void);$/;" p language:C++ class:Av::MediaFile
|
||||
Picture /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^struct Picture$/;" s language:C++ namespace:Av
|
||||
process /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::process(std::vector<unsigned char>& output, std::size_t maxSize)$/;" f language:C++ class:Av::Transcoder
|
||||
process /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void process(std::vector<unsigned char>& output, std::size_t maxSize);$/;" p language:C++ class:Av::Transcoder
|
||||
scan /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::scan(void)$/;" f language:C++ class:Av::MediaFile
|
||||
scan /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ bool scan(void);$/;" p language:C++ class:Av::MediaFile
|
||||
setBitrate /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void setBitrate(Stream::Type type, std::size_t bitrate) { _outputBitrate[type] = bitrate; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
setEncoding /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void setEncoding(Encoding encoding) { _encoding = encoding; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
setFile /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void setFile(boost::filesystem::path p) {_path = p; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
setOffset /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void setOffset(boost::posix_time::time_duration offset) {_offset = offset; }$/;" f language:C++ class:Av::TranscodeParameters
|
||||
start /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::start()$/;" f language:C++ class:Av::Transcoder
|
||||
start /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ bool start();$/;" p language:C++ class:Av::Transcoder
|
||||
Stream /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^struct Stream$/;" s language:C++ namespace:Av
|
||||
streamType_to_string /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^static std::string streamType_to_string(Stream::Type type)$/;" f language:C++ namespace:Av
|
||||
Subtitle /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ Subtitle,$/;" m language:C++ class:Av::Stream::Type
|
||||
TranscodeParameters /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^class TranscodeParameters$/;" c language:C++ namespace:Av
|
||||
Transcoder /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::Transcoder(TrasncodeParameters parameters)$/;" f language:C++ class:Av::Transcoder
|
||||
Transcoder /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ Transcoder(TranscodeParameters parameters);$/;" p language:C++ class:Av::Transcoder
|
||||
Transcoder /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^class Transcoder$/;" c language:C++ namespace:Av
|
||||
Type /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ enum class Type$/;" c language:C++ struct:Av::Stream
|
||||
type /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ Type type;$/;" m language:C++ struct:Av::Stream
|
||||
Video /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ Video,$/;" m language:C++ class:Av::Stream::Type
|
||||
waitChild /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::waitChild()$/;" f language:C++ class:Av::Transcoder
|
||||
waitChild /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ void waitChild();$/;" p language:C++ class:Av::Transcoder
|
||||
WEBMA /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ WEBMA,$/;" m language:C++ class:Av::Encoding
|
||||
WEBMV /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ WEBMV,$/;" m language:C++ class:Av::Encoding
|
||||
_avConvPath /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^boost::filesystem::path Transcoder::_avConvPath = boost::filesystem::path();$/;" m language:C++ class:Av::Transcoder file:
|
||||
_avConvPath /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ static boost::filesystem::path _avConvPath;$/;" m language:C++ class:Av::Transcoder
|
||||
_child /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::shared_ptr<boost::process::child> _child;$/;" m language:C++ class:Av::Transcoder
|
||||
_context /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ AVFormatContext* _context;$/;" m language:C++ class:Av::MediaFile
|
||||
_encoding /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ Encoding _encoding = Encoding::MP3;$/;" m language:C++ class:Av::TranscodeParameters
|
||||
_in /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::istream _in;$/;" m language:C++ class:Av::Transcoder
|
||||
_is /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_source> _is;$/;" m language:C++ class:Av::Transcoder
|
||||
_isComplete /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ bool _isComplete;$/;" m language:C++ class:Av::Transcoder
|
||||
_mutex /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^boost::mutex Transcoder::_mutex;$/;" m language:C++ class:Av::Transcoder file:
|
||||
_mutex /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ static boost::mutex _mutex;$/;" m language:C++ class:Av::Transcoder
|
||||
_offset /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::posix_time::time_duration _offset = boost::posix_time::seconds(0);$/;" m language:C++ class:Av::TranscodeParameters
|
||||
_outputBitrate /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::map<Stream::Type, std::size_t> _outputBitrate = { {Stream::Type::Audio, 0}, { Stream::Type::Video, 0}, { Stream::Type::Subtitle, 0} };$/;" m language:C++ class:Av::TranscodeParameters
|
||||
_outputPipe /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::process::pipe _outputPipe;$/;" m language:C++ class:Av::Transcoder
|
||||
_p /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ boost::filesystem::path _p;$/;" m language:C++ class:Av::MediaFile
|
||||
_parameters /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ TranscodeParameters _parameters;$/;" m language:C++ class:Av::Transcoder
|
||||
_path /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::filesystem::path _path;$/;" m language:C++ class:Av::TranscodeParameters
|
||||
_selectedStreams /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ std::vector<int> _selectedStreams;$/;" m language:C++ class:Av::TranscodeParameters
|
||||
_source /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.hpp /^ boost::iostreams::file_descriptor_source _source;$/;" m language:C++ class:Av::Transcoder
|
||||
__STDC_CONSTANT_MACROS /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp 27;" d language:C++
|
||||
~MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.cpp /^MediaFile::~MediaFile()$/;" f language:C++ class:Av::MediaFile
|
||||
~MediaFile /home/emericp/Documents/Progs/lms/src/av/AvInfo.hpp /^ ~MediaFile();$/;" p language:C++ class:Av::MediaFile
|
||||
~Transcoder /home/emericp/Documents/Progs/lms/src/av/AvTranscoder.cpp /^Transcoder::~Transcoder()$/;" f language:C++ class:Av::Transcoder
|
||||
Reference in New Issue
Block a user