mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-02 05:50:40 +00:00
Previously, the mjpeg quality was always 70. The frame rate was tuned according to the frames' congestion in the pipe. This patch sets the quality and frame rate according to a given bit rate and the size of the first encoded frames. The following patches will introduce an adaptive video streaming, in which the bit rate, the quality, and the frame rate, change in response to different parameters. Patches that make red_worker adopt this feature will also follow.
68 lines
2.3 KiB
C
68 lines
2.3 KiB
C
/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
/*
|
|
Copyright (C) 2009 Red Hat, Inc.
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef _H_MJPEG_ENCODER
|
|
#define _H_MJPEG_ENCODER
|
|
|
|
#include "red_common.h"
|
|
|
|
typedef struct MJpegEncoder MJpegEncoder;
|
|
|
|
/*
|
|
* Callbacks required for controling and adjusting
|
|
* the stream bit rate:
|
|
* get_roundtrip_ms: roundtrip time in milliseconds
|
|
* get_source_fps: the input frame rate (#frames per second), i.e.,
|
|
* the rate of frames arriving from the guest to spice-server,
|
|
* before any drops.
|
|
*/
|
|
typedef struct MJpegEncoderRateControlCbs {
|
|
uint32_t (*get_roundtrip_ms)(void *opaque);
|
|
uint32_t (*get_source_fps)(void *opaque);
|
|
} MJpegEncoderRateControlCbs;
|
|
|
|
MJpegEncoder *mjpeg_encoder_new(int bit_rate_control, uint64_t starting_bit_rate,
|
|
MJpegEncoderRateControlCbs *cbs, void *opaque);
|
|
void mjpeg_encoder_destroy(MJpegEncoder *encoder);
|
|
|
|
uint8_t mjpeg_encoder_get_bytes_per_pixel(MJpegEncoder *encoder);
|
|
|
|
/*
|
|
* *dest must be either NULL or allocated by malloc, since it might be freed
|
|
* during the encoding, if its size is too small.
|
|
*/
|
|
int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
|
|
int width, int height,
|
|
uint8_t **dest, size_t *dest_len);
|
|
int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder, uint8_t *src_pixels,
|
|
size_t image_width);
|
|
size_t mjpeg_encoder_end_frame(MJpegEncoder *encoder);
|
|
|
|
/*
|
|
* bit rate control
|
|
*/
|
|
|
|
/*
|
|
* The recommended output frame rate (per second) for the
|
|
* current available bit rate.
|
|
*/
|
|
uint32_t mjpeg_encoder_get_fps(MJpegEncoder *encoder);
|
|
|
|
|
|
#endif
|