extern "C" {
#include <libavformat/avformat.h>
+#include <libavutil/channel_layout.h>
}
using namespace std;
extern "C" {
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
+#include <libavutil/channel_layout.h>
}
#include "chroma_subsampler.h"
AudioEncoder::AudioEncoder(const string &codec_name, int bit_rate, const AVOutputFormat *oformat)
{
- AVCodec *codec = avcodec_find_encoder_by_name(codec_name.c_str());
+ const AVCodec *codec = avcodec_find_encoder_by_name(codec_name.c_str());
if (codec == nullptr) {
fprintf(stderr, "ERROR: Could not find codec '%s'\n", codec_name.c_str());
abort();
-Subproject commit 327dca2d848e4c4656be1bfb54a2edf2e6587a71
+Subproject commit 6334dc3fcbd67a757f6065a946a2343185c233fc
} else {
#ifdef HAVE_SRT
// SRT socket, already opened.
- AVInputFormat *mpegts_fmt = av_find_input_format("mpegts");
+ const AVInputFormat *mpegts_fmt = av_find_input_format("mpegts");
format_ctx = avformat_open_input_unique(&FFmpegCapture::read_srt_thunk, this,
mpegts_fmt, /*options=*/nullptr,
AVIOInterruptCB{ &FFmpegCapture::interrupt_cb_thunk, this });
// Open video decoder.
const AVCodecParameters *video_codecpar = format_ctx->streams[video_stream_index]->codecpar;
- AVCodec *video_codec = avcodec_find_decoder(video_codecpar->codec_id);
+ const AVCodec *video_codec = avcodec_find_decoder(video_codecpar->codec_id);
video_timebase = format_ctx->streams[video_stream_index]->time_base;
AVCodecContextWithDeleter video_codec_ctx = avcodec_alloc_context3_unique(nullptr);
fprintf(stderr, "%s: Cannot fill audio codec parameters\n", pathname.c_str());
return false;
}
- AVCodec *audio_codec = avcodec_find_decoder(audio_codecpar->codec_id);
+ const AVCodec *audio_codec = avcodec_find_decoder(audio_codecpar->codec_id);
if (audio_codec == nullptr) {
fprintf(stderr, "%s: Cannot find audio decoder\n", pathname.c_str());
return false;
fprintf(stderr, "%s: Cannot fill codec parameters\n", pathname.c_str());
return nullptr;
}
- AVCodec *codec = avcodec_find_decoder(codecpar->codec_id);
+ const AVCodec *codec = avcodec_find_decoder(codecpar->codec_id);
if (codec == nullptr) {
fprintf(stderr, "%s: Cannot find decoder\n", pathname.c_str());
return nullptr;
#include <chrono>
#include <string>
+extern "C" {
+#include <libavcodec/bsf.h>
+}
+
using namespace bmusb;
using namespace movit;
using namespace std;
} // namespace
-unique_ptr<Mux> create_mux(HTTPD *httpd, AVOutputFormat *oformat, X264Encoder *x264_encoder, AudioEncoder *audio_encoder)
+unique_ptr<Mux> create_mux(HTTPD *httpd, const AVOutputFormat *oformat, X264Encoder *x264_encoder, AudioEncoder *audio_encoder)
{
AVFormatContext *avctx = avformat_alloc_context();
avctx->oformat = oformat;
HTTPD httpd;
- AVOutputFormat *oformat = av_guess_format(global_flags.stream_mux_name.c_str(), nullptr, nullptr);
+ const AVOutputFormat *oformat = av_guess_format(global_flags.stream_mux_name.c_str(), nullptr, nullptr);
assert(oformat != nullptr);
unique_ptr<AudioEncoder> audio_encoder;
extern "C" {
#include <libavformat/avformat.h>
+#include <libavutil/channel_layout.h>
}
#include "defs.h"
has_released_gl_resources = true;
}
-QuickSyncEncoderImpl::QuickSyncEncoderImpl(const std::string &filename, ResourcePool *resource_pool, QSurface *surface, const string &va_display, int width, int height, AVOutputFormat *oformat, X264Encoder *http_encoder, X264Encoder *disk_encoder, DiskSpaceEstimator *disk_space_estimator)
+QuickSyncEncoderImpl::QuickSyncEncoderImpl(const std::string &filename, ResourcePool *resource_pool, QSurface *surface, const string &va_display, int width, int height, const AVOutputFormat *oformat, X264Encoder *http_encoder, X264Encoder *disk_encoder, DiskSpaceEstimator *disk_space_estimator)
: current_storage_frame(0), resource_pool(resource_pool), surface(surface), x264_http_encoder(http_encoder), x264_disk_encoder(disk_encoder), frame_width(width), frame_height(height), disk_space_estimator(disk_space_estimator)
{
file_audio_encoder.reset(new AudioEncoder(AUDIO_OUTPUT_CODEC_NAME, DEFAULT_AUDIO_OUTPUT_BIT_RATE, oformat));
}
// Proxy object.
-QuickSyncEncoder::QuickSyncEncoder(const std::string &filename, ResourcePool *resource_pool, QSurface *surface, const string &va_display, int width, int height, AVOutputFormat *oformat, X264Encoder *http_encoder, X264Encoder *disk_encoder, DiskSpaceEstimator *disk_space_estimator)
+QuickSyncEncoder::QuickSyncEncoder(const std::string &filename, ResourcePool *resource_pool, QSurface *surface, const string &va_display, int width, int height, const AVOutputFormat *oformat, X264Encoder *http_encoder, X264Encoder *disk_encoder, DiskSpaceEstimator *disk_space_estimator)
: impl(new QuickSyncEncoderImpl(filename, resource_pool, surface, va_display, width, height, oformat, http_encoder, disk_encoder, disk_space_estimator)) {}
// Must be defined here because unique_ptr<> destructor needs to know the impl.
// This class is _not_ thread-safe, except where mentioned.
class QuickSyncEncoder {
public:
- QuickSyncEncoder(const std::string &filename, movit::ResourcePool *resource_pool, QSurface *surface, const std::string &va_display, int width, int height, AVOutputFormat *oformat, X264Encoder *http_encoder, X264Encoder *disk_encoder, DiskSpaceEstimator *disk_space_estimator);
+ QuickSyncEncoder(const std::string &filename, movit::ResourcePool *resource_pool, QSurface *surface, const std::string &va_display, int width, int height, const AVOutputFormat *oformat, X264Encoder *http_encoder, X264Encoder *disk_encoder, DiskSpaceEstimator *disk_space_estimator);
~QuickSyncEncoder();
void set_stream_mux(Mux *mux); // Does not take ownership. Must be called unless x264 is used for the stream.
class QuickSyncEncoderImpl {
public:
- QuickSyncEncoderImpl(const std::string &filename, movit::ResourcePool *resource_pool, QSurface *surface, const std::string &va_display, int width, int height, AVOutputFormat *oformat, X264Encoder *http_encoder, X264Encoder *disk_encoder, DiskSpaceEstimator *disk_space_estimator);
+ QuickSyncEncoderImpl(const std::string &filename, movit::ResourcePool *resource_pool, QSurface *surface, const std::string &va_display, int width, int height, const AVOutputFormat *oformat, X264Encoder *http_encoder, X264Encoder *disk_encoder, DiskSpaceEstimator *disk_space_estimator);
~QuickSyncEncoderImpl();
void add_audio(int64_t pts, std::vector<float> audio);
bool is_zerocopy() const;
static int write_packet2_thunk(void *opaque, uint8_t *buf, int buf_size, AVIODataMarkerType type, int64_t time);
int write_packet2(uint8_t *buf, int buf_size, AVIODataMarkerType type, int64_t time);
- AVOutputFormat *oformat;
+ const AVOutputFormat *oformat;
mutable std::mutex qs_mu, qs_audio_mu;
std::unique_ptr<QuickSyncEncoder> quicksync_encoder; // Under <qs_mu> _and_ <qs_audio_mu>.
movit::ResourcePool *resource_pool;
} // namespace
-X264Encoder::X264Encoder(AVOutputFormat *oformat, bool use_separate_disk_params)
+X264Encoder::X264Encoder(const AVOutputFormat *oformat, bool use_separate_disk_params)
: wants_global_headers(oformat->flags & AVFMT_GLOBALHEADER),
use_separate_disk_params(use_separate_disk_params),
dyn(load_x264_for_bit_depth(global_flags.x264_bit_depth))
class X264Encoder {
public:
- X264Encoder(AVOutputFormat *oformat, bool use_separate_disk_params); // Does not take ownership.
+ X264Encoder(const AVOutputFormat *oformat, bool use_separate_disk_params); // Does not take ownership.
// Called after the last frame. Will block; once this returns,
// the last data is flushed.
}
AVFormatContextWithCloser avformat_open_input_unique(
- const char *pathname, AVInputFormat *fmt,
+ const char *pathname, const AVInputFormat *fmt,
AVDictionary **options)
{
return avformat_open_input_unique(pathname, fmt, options, AVIOInterruptCB{ nullptr, nullptr });
}
AVFormatContextWithCloser avformat_open_input_unique(
- const char *pathname, AVInputFormat *fmt,
+ const char *pathname, const AVInputFormat *fmt,
AVDictionary **options,
const AVIOInterruptCB &interrupt_cb)
{
AVFormatContextWithCloser avformat_open_input_unique(
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
- void *opaque, AVInputFormat *fmt, AVDictionary **options,
+ void *opaque, const AVInputFormat *fmt, AVDictionary **options,
const AVIOInterruptCB &interrupt_cb)
{
AVFormatContext *format_ctx = avformat_alloc_context();
AVFormatContextWithCloser;
AVFormatContextWithCloser avformat_open_input_unique(
- const char *pathname, AVInputFormat *fmt,
+ const char *pathname, const AVInputFormat *fmt,
AVDictionary **options);
AVFormatContextWithCloser avformat_open_input_unique(
- const char *pathname, AVInputFormat *fmt,
+ const char *pathname, const AVInputFormat *fmt,
AVDictionary **options,
const AVIOInterruptCB &interrupt_cb);
AVFormatContextWithCloser avformat_open_input_unique(
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
- void *opaque, AVInputFormat *fmt, AVDictionary **options,
+ void *opaque, const AVInputFormat *fmt, AVDictionary **options,
const AVIOInterruptCB &interrupt_cb);