Squashed 'external/toxcore/c-toxcore/' changes from 76bc4c496d..501a32937f
501a32937f Merge branch 'toxav_deadline' of github.com:Green-Sky/c-toxcore into tomato_testing_in_prod 0b49ba2d94 Merge branch 'toxav_video_bitrate' of github.com:Green-Sky/c-toxcore into tomato_testing_in_prod 9c0977d7c6 Merge branch 'toxav_remove_img_copy_encode' of github.com:Green-Sky/c-toxcore into tomato_testing_in_prod 4071d74cc9 fix(ngc): dont double every message, if we are not directly connected but we and the other peer would support direct. 1d4cc783b1 fix(bazel): one more fuzz target that needs netprof 066aafbfcd fix(bazel): make net_prof visible to its consumers fa015c7e2e fix(toxav): remove extra copy of video frame on encode Tested and works, but there might be alignment issues and other stuff. d34f7d1f5c fix(toxav): handle vpx_image_alloc failure 865261a67a chore(toxav): use realtime deadline for vp8 encoder Technically all this does is choose a quality based on frame duration, which we always set to 1, and as such is always realtime. (In same timebase as pts, which we use as a frame counter...) dd12b9889a chore(toxav): tighten the video bitrate to the same as the vp8 encoder internally checks. 9dcc2f530d fix(bazel): missing dep for auto_tests 741ac5f5e6 fix(bazel): missing dep for fuzz target git-subtree-dir: external/toxcore/c-toxcore git-subtree-split: 501a32937f4550d4340406a6a73da548849a53af
This commit is contained in:
@ -24,19 +24,8 @@
|
||||
#include "../toxcore/tox_struct.h" // IWYU pragma: keep
|
||||
#include "../toxcore/util.h"
|
||||
|
||||
// TODO(zoff99): don't hardcode this, let the application choose it
|
||||
// VPX Info: Time to spend encoding, in microseconds (it's a *soft* deadline)
|
||||
#define WANTED_MAX_ENCODER_FPS 40
|
||||
#define MAX_ENCODE_TIME_US (1000000 / WANTED_MAX_ENCODER_FPS) // to allow x fps
|
||||
|
||||
#define VIDEO_SEND_X_KEYFRAMES_FIRST 7 // force the first n frames to be keyframes!
|
||||
|
||||
/*
|
||||
* VPX_DL_REALTIME (1) deadline parameter analogous to VPx REALTIME mode.
|
||||
* VPX_DL_GOOD_QUALITY (1000000) deadline parameter analogous to VPx GOOD QUALITY mode.
|
||||
* VPX_DL_BEST_QUALITY (0) deadline parameter analogous to VPx BEST QUALITY mode.
|
||||
*/
|
||||
|
||||
// iteration interval that is used when no call is active
|
||||
#define IDLE_ITERATION_INTERVAL_MS 200
|
||||
|
||||
@ -1055,6 +1044,7 @@ bool toxav_video_send_frame(ToxAV *av, uint32_t friend_number, uint16_t width, u
|
||||
goto RETURN;
|
||||
}
|
||||
|
||||
// we start with I-frames (full frames) and then switch to normal mode later
|
||||
if (call->video_rtp->ssrc < VIDEO_SEND_X_KEYFRAMES_FIRST) {
|
||||
// Key frame flag for first frames
|
||||
vpx_encode_flags = VPX_EFLAG_FORCE_KF;
|
||||
@ -1069,25 +1059,35 @@ bool toxav_video_send_frame(ToxAV *av, uint32_t friend_number, uint16_t width, u
|
||||
++call->video_rtp->ssrc;
|
||||
}
|
||||
|
||||
// we start with I-frames (full frames) and then switch to normal mode later
|
||||
|
||||
{ /* Encode */
|
||||
vpx_image_t img;
|
||||
img.w = 0;
|
||||
img.h = 0;
|
||||
img.d_w = 0;
|
||||
img.d_h = 0;
|
||||
vpx_img_alloc(&img, VPX_IMG_FMT_I420, width, height, 0);
|
||||
// TODO(Green-Sky): figure out stride_align
|
||||
// TODO(Green-Sky): check memory alignment?
|
||||
if (vpx_img_wrap(&img, VPX_IMG_FMT_I420, width, height, 0, (uint8_t *)y) != nullptr) {
|
||||
// vpx_img_wrap assumes contigues memory, so we fix that
|
||||
img.planes[VPX_PLANE_U] = (uint8_t *)u;
|
||||
img.planes[VPX_PLANE_V] = (uint8_t *)v;
|
||||
} else {
|
||||
// call to wrap failed, falling back to copy
|
||||
img.w = 0;
|
||||
img.h = 0;
|
||||
img.d_w = 0;
|
||||
img.d_h = 0;
|
||||
vpx_img_alloc(&img, VPX_IMG_FMT_I420, width, height, 0);
|
||||
|
||||
/* I420 "It comprises an NxM Y plane followed by (N/2)x(M/2) V and U planes."
|
||||
* http://fourcc.org/yuv.php#IYUV
|
||||
*/
|
||||
memcpy(img.planes[VPX_PLANE_Y], y, width * height);
|
||||
memcpy(img.planes[VPX_PLANE_U], u, (width / 2) * (height / 2));
|
||||
memcpy(img.planes[VPX_PLANE_V], v, (width / 2) * (height / 2));
|
||||
/* I420 "It comprises an NxM Y plane followed by (N/2)x(M/2) V and U planes."
|
||||
* http://fourcc.org/yuv.php#IYUV
|
||||
*/
|
||||
memcpy(img.planes[VPX_PLANE_Y], y, width * height);
|
||||
memcpy(img.planes[VPX_PLANE_U], u, (width / 2) * (height / 2));
|
||||
memcpy(img.planes[VPX_PLANE_V], v, (width / 2) * (height / 2));
|
||||
}
|
||||
|
||||
// TODO(zoff99): don't hardcode this, let the application choose it
|
||||
const vpx_enc_deadline_t deadline = VPX_DL_REALTIME;
|
||||
|
||||
const vpx_codec_err_t vrc = vpx_codec_encode(call->video->encoder, &img,
|
||||
call->video->frame_counter, 1, vpx_encode_flags, MAX_ENCODE_TIME_US);
|
||||
call->video->frame_counter, 1, vpx_encode_flags, deadline);
|
||||
|
||||
vpx_img_free(&img);
|
||||
|
||||
@ -1304,14 +1304,11 @@ static bool audio_bit_rate_invalid(uint32_t bit_rate)
|
||||
|
||||
static bool video_bit_rate_invalid(uint32_t bit_rate)
|
||||
{
|
||||
/* https://www.webmproject.org/docs/webm-sdk/structvpx__codec__enc__cfg.html shows the following:
|
||||
* unsigned int rc_target_bitrate
|
||||
* the range of uint varies from platform to platform
|
||||
* though, uint32_t should be large enough to store bitrates,
|
||||
* we may want to prevent from passing overflowed bitrates to libvpx
|
||||
* more in detail, it's the case where bit_rate is larger than uint, but smaller than uint32_t
|
||||
/* Cap the target rate to 1000 Mbps to avoid some integer overflows in
|
||||
* target bandwidth calculations.
|
||||
* https://github.com/webmproject/libvpx/blob/027bbee30a0103b99d86327b48d29567fed11688/vp8/vp8_cx_iface.c#L350-L352
|
||||
*/
|
||||
return bit_rate > UINT32_MAX;
|
||||
return bit_rate > 1000000;
|
||||
}
|
||||
|
||||
static bool invoke_call_state_callback(ToxAV *av, uint32_t friend_number, uint32_t state)
|
||||
|
@ -15,27 +15,6 @@
|
||||
#include "../toxcore/logger.h"
|
||||
#include "../toxcore/mono_time.h"
|
||||
|
||||
/**
|
||||
* Soft deadline the decoder should attempt to meet, in "us" (microseconds).
|
||||
* Set to zero for unlimited.
|
||||
*
|
||||
* By convention, the value 1 is used to mean "return as fast as possible."
|
||||
*/
|
||||
// TODO(zoff99): don't hardcode this, let the application choose it
|
||||
#define WANTED_MAX_DECODER_FPS 40
|
||||
|
||||
/**
|
||||
* VPX_DL_REALTIME (1)
|
||||
* deadline parameter analogous to VPx REALTIME mode.
|
||||
*
|
||||
* VPX_DL_GOOD_QUALITY (1000000)
|
||||
* deadline parameter analogous to VPx GOOD QUALITY mode.
|
||||
*
|
||||
* VPX_DL_BEST_QUALITY (0)
|
||||
* deadline parameter analogous to VPx BEST QUALITY mode.
|
||||
*/
|
||||
#define MAX_DECODE_TIME_US (1000000 / WANTED_MAX_DECODER_FPS) // to allow x fps
|
||||
|
||||
/**
|
||||
* Codec control function to set encoder internal speed settings. Changes in
|
||||
* this value influences, among others, the encoder's selection of motion
|
||||
@ -320,7 +299,7 @@ void vc_iterate(VCSession *vc)
|
||||
|
||||
LOGGER_DEBUG(vc->log, "vc_iterate: rb_read p->len=%d p->header.xe=%d", (int)full_data_len, p->header.xe);
|
||||
LOGGER_DEBUG(vc->log, "vc_iterate: rb_read rb size=%d", (int)log_rb_size);
|
||||
const vpx_codec_err_t rc = vpx_codec_decode(vc->decoder, p->data, full_data_len, nullptr, MAX_DECODE_TIME_US);
|
||||
const vpx_codec_err_t rc = vpx_codec_decode(vc->decoder, p->data, full_data_len, nullptr, 0);
|
||||
free(p);
|
||||
|
||||
if (rc != VPX_CODEC_OK) {
|
||||
|
Reference in New Issue
Block a user