To packetize the H.264 raw stream, av_parser_parse2() (called by av_read_frame()) knows that it has received a full frame only after it has received some data for the next frame. As a consequence, the client always waited until the next frame before sending the current frame to the decoder! On the device side, we know packets boundaries. To reduce latency, make the device always transmit the "frame meta" to packetize the stream manually (it was already implemented to send PTS, but only enabled on recording). On the client side, replace av_read_frame() by manual packetizing and parsing. <https://stackoverflow.com/questions/50682518/replacing-av-read-frame-to-reduce-delay> <https://trac.ffmpeg.org/ticket/3354>
62 lines
1.4 KiB
C
62 lines
1.4 KiB
C
#ifndef SERVER_H
|
|
#define SERVER_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include "command.h"
|
|
#include "net.h"
|
|
|
|
struct server {
|
|
char *serial;
|
|
process_t process;
|
|
socket_t server_socket; // only used if !tunnel_forward
|
|
socket_t video_socket;
|
|
socket_t control_socket;
|
|
uint16_t local_port;
|
|
bool tunnel_enabled;
|
|
bool tunnel_forward; // use "adb forward" instead of "adb reverse"
|
|
};
|
|
|
|
#define SERVER_INITIALIZER { \
|
|
.serial = NULL, \
|
|
.process = PROCESS_NONE, \
|
|
.server_socket = INVALID_SOCKET, \
|
|
.video_socket = INVALID_SOCKET, \
|
|
.control_socket = INVALID_SOCKET, \
|
|
.local_port = 0, \
|
|
.tunnel_enabled = false, \
|
|
.tunnel_forward = false, \
|
|
}
|
|
|
|
struct server_params {
|
|
const char *crop;
|
|
uint16_t local_port;
|
|
uint16_t max_size;
|
|
uint32_t bit_rate;
|
|
bool control;
|
|
};
|
|
|
|
// init default values
|
|
void
|
|
server_init(struct server *server);
|
|
|
|
// push, enable tunnel et start the server
|
|
bool
|
|
server_start(struct server *server, const char *serial,
|
|
const struct server_params *params);
|
|
|
|
// block until the communication with the server is established
|
|
bool
|
|
server_connect_to(struct server *server);
|
|
|
|
// disconnect and kill the server process
|
|
void
|
|
server_stop(struct server *server);
|
|
|
|
// close and release sockets
|
|
void
|
|
server_destroy(struct server *server);
|
|
|
|
#endif
|