-void QuickSyncEncoderImpl::open_output_stream()
-{
- AVFormatContext *avctx = avformat_alloc_context();
- AVOutputFormat *oformat = av_guess_format(global_flags.stream_mux_name.c_str(), nullptr, nullptr);
- 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, &QuickSyncEncoderImpl::write_packet_thunk, nullptr);
-
- Mux::Codec video_codec;
- if (global_flags.uncompressed_video_to_http) {
- video_codec = Mux::CODEC_NV12;
- } else {
- video_codec = Mux::CODEC_H264;
- }
-
- 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, frame_width, frame_height, video_codec, codec_audio, time_base, bit_rate, this));
- stream_mux_writing_header = false;
- httpd->set_header(stream_mux_header);
- stream_mux_header.clear();
-}
-
-void QuickSyncEncoderImpl::close_output_stream()
-{
- stream_mux.reset();
-}
-
-int QuickSyncEncoderImpl::write_packet_thunk(void *opaque, uint8_t *buf, int buf_size)
-{
- QuickSyncEncoderImpl *h264_encoder = (QuickSyncEncoderImpl *)opaque;
- return h264_encoder->write_packet(buf, buf_size);
-}
-
-int QuickSyncEncoderImpl::write_packet(uint8_t *buf, int buf_size)
-{
- if (stream_mux_writing_header) {
- stream_mux_header.append((char *)buf, buf_size);
- } else {
- httpd->add_data((char *)buf, buf_size, stream_mux_writing_keyframes);
- stream_mux_writing_keyframes = false;
- }
- return buf_size;
-}
-