#include "x264_encoder.h"
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "defs.h"
#include "flags.h"
#include "mux.h"
+#include "print_latency.h"
#include "timebase.h"
#include "x264_speed_control.h"
}
using namespace std;
+using namespace std::chrono;
namespace {
encoder_thread.join();
}
-void X264Encoder::add_frame(int64_t pts, int64_t duration, const uint8_t *data)
+void X264Encoder::add_frame(int64_t pts, int64_t duration, const uint8_t *data, const ReceivedTimestamps &received_ts)
{
QueuedFrame qf;
qf.pts = pts;
qf.duration = duration;
+ qf.received_ts = received_ts;
{
lock_guard<mutex> lock(mu);
param.i_frame_reference = 16; // Because speedcontrol is never allowed to change this above what we set at start.
}
- // NOTE: These should be in sync with the ones in h264encode.cpp (sbs_rbsp()).
+ // NOTE: These should be in sync with the ones in quicksync_encoder.cpp (sps_rbsp()).
param.vui.i_vidformat = 5; // Unspecified.
param.vui.b_fullrange = 0;
param.vui.i_colorprim = 1; // BT.709.
param.vui.i_transfer = 2; // Unspecified (since we use sRGB).
- param.vui.i_colmatrix = 6; // BT.601/SMPTE 170M.
-
+ if (global_flags.ycbcr_rec709_coefficients) {
+ param.vui.i_colmatrix = 1; // BT.709.
+ } else {
+ param.vui.i_colmatrix = 6; // BT.601/SMPTE 170M.
+ }
param.rc.i_rc_method = X264_RC_ABR;
param.rc.i_bitrate = global_flags.x264_bitrate;
pic.opaque = reinterpret_cast<void *>(intptr_t(qf.duration));
input_pic = &pic;
+
+ frames_being_encoded[qf.pts] = qf.received_ts;
}
// See if we have a new bitrate to change to.
if (num_nal == 0) return;
+ if (frames_being_encoded.count(pic.i_pts)) {
+ ReceivedTimestamps received_ts = frames_being_encoded[pic.i_pts];
+ frames_being_encoded.erase(pic.i_pts);
+
+ static int frameno = 0;
+ print_latency("Current x264 latency (video inputs → network mux):",
+ received_ts, (pic.i_type == X264_TYPE_B || pic.i_type == X264_TYPE_BREF),
+ &frameno);
+ } else {
+ assert(false);
+ }
+
// We really need one AVPacket for the entire frame, it seems,
// so combine it all.
size_t num_bytes = buffered_sei.size();