X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=kaeru.cpp;h=10f1e9394b2a5c0ddab4e42a226b0ff7af4ccc73;hb=6ffaabac0a523617b686f40c154a25cb548cc561;hp=dd91239c7b0e081cc706eedfd90c3e7bcdd6d313;hpb=f53bc097f57c9875a5c43c43bea5fa596e0bf99f;p=nageru diff --git a/kaeru.cpp b/kaeru.cpp index dd91239..10f1e93 100644 --- a/kaeru.cpp +++ b/kaeru.cpp @@ -1,5 +1,4 @@ // Kaeru (換える), a simple transcoder intended for use with Nageru. -// This is experimental code, not yet supported. #include "audio_encoder.h" #include "basic_stats.h" @@ -50,7 +49,7 @@ int write_packet(void *opaque, uint8_t *buf, int buf_size, AVIODataMarkerType ty stream_mux_header.append((char *)buf, buf_size); httpd->set_header(stream_mux_header); } else { - httpd->add_data((char *)buf, buf_size, type == AVIO_DATA_MARKER_SYNC_POINT); + httpd->add_data((char *)buf, buf_size, type == AVIO_DATA_MARKER_SYNC_POINT, time, AVRational{ AV_TIME_BASE, 1 }); } return buf_size; } @@ -69,8 +68,7 @@ unique_ptr create_mux(HTTPD *httpd, AVOutputFormat *oformat, X264Encoder *x string video_extradata = x264_encoder->get_global_headers(); unique_ptr mux; - int time_base = global_flags.stream_coarse_timebase ? COARSE_TIMEBASE : TIMEBASE; - mux.reset(new Mux(avctx, global_flags.width, global_flags.height, Mux::CODEC_H264, video_extradata, audio_encoder->get_codec_parameters().get(), time_base, + mux.reset(new Mux(avctx, global_flags.width, global_flags.height, Mux::CODEC_H264, video_extradata, audio_encoder->get_codec_parameters().get(), COARSE_TIMEBASE, /*write_callback=*/nullptr, Mux::WRITE_FOREGROUND, { &stream_mux_metrics })); stream_mux_metrics.init({{ "destination", "http" }}); return mux; @@ -130,7 +128,7 @@ void video_frame_callback(FFmpegCapture *video, X264Encoder *x264_encoder, Audio void audio_frame_callback(Mux *mux, const AVPacket *pkt, AVRational timebase) { - mux->add_packet(*pkt, pkt->pts, pkt->dts == AV_NOPTS_VALUE ? pkt->pts : pkt->dts, timebase); + mux->add_packet(*pkt, pkt->pts, pkt->dts == AV_NOPTS_VALUE ? pkt->pts : pkt->dts, timebase, /*stream_index=*/1); } void adjust_bitrate(int signal) @@ -149,10 +147,10 @@ void adjust_bitrate(int signal) } else if (signal == SIGUSR2) { new_bitrate -= 100; if (new_bitrate < 100) { - fprintf(stderr, "Ignoring SIGUSR1, can't decrease bitrate below 100 kbit/sec (currently at %d kbit/sec)\n", + fprintf(stderr, "Ignoring SIGUSR2, can't decrease bitrate below 100 kbit/sec (currently at %d kbit/sec)\n", global_flags.x264_bitrate); } else { - fprintf(stderr, "Decreasing bitrate to %d kbit/sec due to SIGUSR1.\n", new_bitrate); + fprintf(stderr, "Decreasing bitrate to %d kbit/sec due to SIGUSR2.\n", new_bitrate); global_flags.x264_bitrate = new_bitrate; global_x264_encoder->change_bitrate(new_bitrate); } @@ -173,7 +171,9 @@ int main(int argc, char *argv[]) } global_flags.num_cards = 1; // For latency metrics. +#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58, 9, 100) av_register_all(); +#endif avformat_network_init(); HTTPD httpd; @@ -182,12 +182,10 @@ int main(int argc, char *argv[]) assert(oformat != nullptr); unique_ptr audio_encoder; - if (global_flags.transcode_audio) { - if (global_flags.stream_audio_codec_name.empty()) { - audio_encoder.reset(new AudioEncoder(AUDIO_OUTPUT_CODEC_NAME, DEFAULT_AUDIO_OUTPUT_BIT_RATE, oformat)); - } else { - audio_encoder.reset(new AudioEncoder(global_flags.stream_audio_codec_name, global_flags.stream_audio_codec_bitrate, oformat)); - } + if (global_flags.stream_audio_codec_name.empty()) { + audio_encoder.reset(new AudioEncoder(AUDIO_OUTPUT_CODEC_NAME, DEFAULT_AUDIO_OUTPUT_BIT_RATE, oformat)); + } else { + audio_encoder.reset(new AudioEncoder(global_flags.stream_audio_codec_name, global_flags.stream_audio_codec_bitrate, oformat)); } unique_ptr x264_encoder(new X264Encoder(oformat)); @@ -208,9 +206,9 @@ int main(int argc, char *argv[]) video.start_bm_capture(); video.change_rate(2.0); // Be sure never to really fall behind, but also don't dump huge amounts of stuff onto x264. - BasicStats basic_stats(/*verbose=*/false); + BasicStats basic_stats(/*verbose=*/false, /*use_opengl=*/false); global_basic_stats = &basic_stats; - httpd.start(9095); + httpd.start(global_flags.http_port); signal(SIGUSR1, adjust_bitrate); signal(SIGUSR2, adjust_bitrate);