#include "httpd.h"
#include "timebase.h"
#include "quicksync_encoder.h"
+#include "x264_encoder.h"
using namespace std;
+using namespace movit;
namespace {
} // namespace
-VideoEncoder::VideoEncoder(QSurface *surface, const std::string &va_display, int width, int height, HTTPD *httpd)
- : surface(surface), va_display(va_display), width(width), height(height), httpd(httpd)
+VideoEncoder::VideoEncoder(ResourcePool *resource_pool, QSurface *surface, const std::string &va_display, int width, int height, HTTPD *httpd)
+ : resource_pool(resource_pool), surface(surface), va_display(va_display), width(width), height(height), httpd(httpd)
{
open_output_stream();
- quicksync_encoder.reset(new QuickSyncEncoder(surface, va_display, width, height, stream_mux.get()));
- quicksync_encoder->open_output_file(generate_local_dump_filename(/*frame=*/0).c_str());
+ if (global_flags.stream_audio_codec_name.empty()) {
+ stream_audio_encoder.reset(new AudioEncoder(AUDIO_OUTPUT_CODEC_NAME, DEFAULT_AUDIO_OUTPUT_BIT_RATE));
+ } else {
+ stream_audio_encoder.reset(new AudioEncoder(global_flags.stream_audio_codec_name, global_flags.stream_audio_codec_bitrate));
+ }
+ stream_audio_encoder->add_mux(stream_mux.get());
+
+ if (global_flags.x264_video_to_http) {
+ x264_encoder.reset(new X264Encoder(stream_mux.get()));
+ }
+
+ string filename = generate_local_dump_filename(/*frame=*/0);
+ quicksync_encoder.reset(new QuickSyncEncoder(filename, resource_pool, surface, va_display, width, height, stream_mux.get(), stream_audio_encoder.get(), x264_encoder.get()));
}
VideoEncoder::~VideoEncoder()
{
string filename = generate_local_dump_filename(frame);
printf("Starting new recording: %s\n", filename.c_str());
- quicksync_encoder->close_output_file();
quicksync_encoder->shutdown();
- quicksync_encoder.reset(new QuickSyncEncoder(surface, va_display, width, height, stream_mux.get()));
- quicksync_encoder->open_output_file(filename.c_str());
+ quicksync_encoder.reset(new QuickSyncEncoder(filename, resource_pool, surface, va_display, width, height, stream_mux.get(), stream_audio_encoder.get(), x264_encoder.get()));
}
void VideoEncoder::add_audio(int64_t pts, std::vector<float> audio)
assert(oformat != nullptr);
avctx->oformat = oformat;
- string codec_name;
- int bit_rate;
-
- if (global_flags.stream_audio_codec_name.empty()) {
- codec_name = AUDIO_OUTPUT_CODEC_NAME;
- bit_rate = DEFAULT_AUDIO_OUTPUT_BIT_RATE;
- } else {
- codec_name = global_flags.stream_audio_codec_name;
- bit_rate = global_flags.stream_audio_codec_bitrate;
- }
-
uint8_t *buf = (uint8_t *)av_malloc(MUX_BUFFER_SIZE);
avctx->pb = avio_alloc_context(buf, MUX_BUFFER_SIZE, 1, this, nullptr, &VideoEncoder::write_packet_thunk, nullptr);
}
avctx->flags = AVFMT_FLAG_CUSTOM_IO;
- AVCodec *codec_audio = avcodec_find_encoder_by_name(codec_name.c_str());
- if (codec_audio == nullptr) {
- fprintf(stderr, "ERROR: Could not find codec '%s'\n", codec_name.c_str());
- exit(1);
- }
int time_base = global_flags.stream_coarse_timebase ? COARSE_TIMEBASE : TIMEBASE;
stream_mux_writing_header = true;
- stream_mux.reset(new Mux(avctx, width, height, video_codec, codec_audio, time_base, bit_rate, this));
+ stream_mux.reset(new Mux(avctx, width, height, video_codec, stream_audio_encoder->get_ctx(), time_base, this));
stream_mux_writing_header = false;
httpd->set_header(stream_mux_header);
stream_mux_header.clear();