[Spice-devel] [PATCH v6 03/26] server: Move the MJPEG encoder functions to mjpeg_encoder.c
Christophe Fergeau
cfergeau at redhat.com
Wed Oct 21 05:47:08 PDT 2015
ACK.
On Wed, Oct 14, 2015 at 05:31:01PM +0200, Francois Gouget wrote:
> Note that this requires some adjustments to the encode_frame()
> parameters to avoid red_worker-specific types.
>
> Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
> ---
> server/mjpeg_encoder.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++---
> server/mjpeg_encoder.h | 6 ++--
> server/red_worker.c | 73 ++++---------------------------------------------
> 3 files changed, 78 insertions(+), 75 deletions(-)
>
> diff --git a/server/mjpeg_encoder.c b/server/mjpeg_encoder.c
> index 96d84ad..96b8f06 100644
> --- a/server/mjpeg_encoder.c
> +++ b/server/mjpeg_encoder.c
> @@ -191,7 +191,7 @@ void mjpeg_encoder_destroy(MJpegEncoder *encoder)
> free(encoder);
> }
>
> -uint8_t mjpeg_encoder_get_bytes_per_pixel(MJpegEncoder *encoder)
> +static uint8_t mjpeg_encoder_get_bytes_per_pixel(MJpegEncoder *encoder)
> {
> return encoder->bytes_per_pixel;
> }
> @@ -692,7 +692,8 @@ static void mjpeg_encoder_adjust_fps(MJpegEncoder *encoder, uint64_t now)
> }
> }
>
> -int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
> +int mjpeg_encoder_start_frame(MJpegEncoder *encoder,
> + SpiceBitmapFmt format,
> int width, int height,
> uint8_t **dest, size_t *dest_len,
> uint32_t frame_mm_time)
> @@ -793,8 +794,9 @@ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
> return MJPEG_ENCODER_FRAME_ENCODE_START;
> }
>
> -int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder, uint8_t *src_pixels,
> - size_t image_width)
> +static int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder,
> + uint8_t *src_pixels,
> + size_t image_width)
> {
> unsigned int scanlines_written;
> uint8_t *row;
> @@ -850,6 +852,69 @@ size_t mjpeg_encoder_end_frame(MJpegEncoder *encoder)
> return encoder->rate_control.last_enc_size;
> }
>
> +static inline uint8_t *get_image_line(SpiceChunks *chunks, size_t *offset,
> + int *chunk_nr, int stride)
> +{
> + uint8_t *ret;
> + SpiceChunk *chunk;
> +
> + chunk = &chunks->chunk[*chunk_nr];
> +
> + if (*offset == chunk->len) {
> + if (*chunk_nr == chunks->num_chunks - 1) {
> + return NULL; /* Last chunk */
> + }
> + *offset = 0;
> + (*chunk_nr)++;
> + chunk = &chunks->chunk[*chunk_nr];
> + }
> +
> + if (chunk->len - *offset < stride) {
> + spice_warning("bad chunk alignment");
> + return NULL;
> + }
> + ret = chunk->data + *offset;
> + *offset += stride;
> + return ret;
> +}
> +
> +int mjpeg_encoder_encode_frame(MJpegEncoder *encoder, const SpiceRect *src,
> + const SpiceBitmap *image, int top_down)
> +{
> + SpiceChunks *chunks;
> + uint32_t image_stride;
> + size_t offset;
> + int i, chunk;
> +
> + chunks = image->data;
> + offset = 0;
> + chunk = 0;
> + image_stride = image->stride;
> +
> + const int skip_lines = top_down ? src->top : image->y - (src->bottom - 0);
> + for (i = 0; i < skip_lines; i++) {
> + get_image_line(chunks, &offset, &chunk, image_stride);
> + }
> +
> + const unsigned int stream_height = src->bottom - src->top;
> + const unsigned int stream_width = src->right - src->left;
> +
> + for (i = 0; i < stream_height; i++) {
> + uint8_t *src_line = get_image_line(chunks, &offset, &chunk, image_stride);
> +
> + if (!src_line) {
> + return FALSE;
> + }
> +
> + src_line += src->left * mjpeg_encoder_get_bytes_per_pixel(encoder);
> + if (mjpeg_encoder_encode_scanline(encoder, src_line, stream_width) == 0) {
> + return FALSE;
> + }
> + }
> +
> + return TRUE;
> +}
> +
> static void mjpeg_encoder_quality_eval_stop(MJpegEncoder *encoder)
> {
> MJpegEncoderRateControl *rate_control = &encoder->rate_control;
> @@ -1020,6 +1085,7 @@ static void mjpeg_encoder_increase_bit_rate(MJpegEncoder *encoder)
> rate_control->quality_id,
> rate_control->fps);
> }
> +
> static void mjpeg_encoder_handle_positive_client_stream_report(MJpegEncoder *encoder,
> uint32_t report_start_frame_mm_time)
> {
> diff --git a/server/mjpeg_encoder.h b/server/mjpeg_encoder.h
> index d584b92..8e2af10 100644
> --- a/server/mjpeg_encoder.h
> +++ b/server/mjpeg_encoder.h
> @@ -53,8 +53,6 @@ MJpegEncoder *mjpeg_encoder_new(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.
> @@ -70,8 +68,8 @@ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
> int width, int height,
> uint8_t **dest, size_t *dest_len,
> uint32_t frame_mm_time);
> -int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder, uint8_t *src_pixels,
> - size_t image_width);
> +int mjpeg_encoder_encode_frame(MJpegEncoder *encoder, const SpiceRect *src,
> + const SpiceBitmap *image, int top_down);
> size_t mjpeg_encoder_end_frame(MJpegEncoder *encoder);
>
> /*
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 616be72..6a77106 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -8463,69 +8463,6 @@ static inline void display_begin_send_message(RedChannelClient *rcc)
> red_channel_client_begin_send_message(rcc);
> }
>
> -static inline uint8_t *red_get_image_line(SpiceChunks *chunks, size_t *offset,
> - int *chunk_nr, int stride)
> -{
> - uint8_t *ret;
> - SpiceChunk *chunk;
> -
> - chunk = &chunks->chunk[*chunk_nr];
> -
> - if (*offset == chunk->len) {
> - if (*chunk_nr == chunks->num_chunks - 1) {
> - return NULL; /* Last chunk */
> - }
> - *offset = 0;
> - (*chunk_nr)++;
> - chunk = &chunks->chunk[*chunk_nr];
> - }
> -
> - if (chunk->len - *offset < stride) {
> - spice_warning("bad chunk alignment");
> - return NULL;
> - }
> - ret = chunk->data + *offset;
> - *offset += stride;
> - return ret;
> -}
> -
> -static int encode_frame(DisplayChannelClient *dcc, const SpiceRect *src,
> - const SpiceBitmap *image, Stream *stream)
> -{
> - SpiceChunks *chunks;
> - uint32_t image_stride;
> - size_t offset;
> - int i, chunk;
> - StreamAgent *agent = &dcc->stream_agents[stream - dcc->common.worker->streams_buf];
> -
> - chunks = image->data;
> - offset = 0;
> - chunk = 0;
> - image_stride = image->stride;
> -
> - const int skip_lines = stream->top_down ? src->top : image->y - (src->bottom - 0);
> - for (i = 0; i < skip_lines; i++) {
> - red_get_image_line(chunks, &offset, &chunk, image_stride);
> - }
> -
> - const unsigned int stream_height = src->bottom - src->top;
> - const unsigned int stream_width = src->right - src->left;
> -
> - for (i = 0; i < stream_height; i++) {
> - uint8_t *src_line = red_get_image_line(chunks, &offset, &chunk, image_stride);
> -
> - if (!src_line) {
> - return FALSE;
> - }
> -
> - src_line += src->left * mjpeg_encoder_get_bytes_per_pixel(agent->mjpeg_encoder);
> - if (mjpeg_encoder_encode_scanline(agent->mjpeg_encoder, src_line, stream_width) == 0)
> - return FALSE;
> - }
> -
> - return TRUE;
> -}
> -
> static inline int red_marshall_stream_data(RedChannelClient *rcc,
> SpiceMarshaller *base_marshaller, Drawable *drawable)
> {
> @@ -8584,6 +8521,7 @@ static inline int red_marshall_stream_data(RedChannelClient *rcc,
> frame_mm_time = drawable->red_drawable->mm_time ?
> drawable->red_drawable->mm_time :
> reds_get_mm_time();
> +
> outbuf_size = dcc->send_data.stream_outbuf_size;
> ret = mjpeg_encoder_start_frame(agent->mjpeg_encoder, image->u.bitmap.format,
> width, height,
> @@ -8606,10 +8544,11 @@ static inline int red_marshall_stream_data(RedChannelClient *rcc,
> return FALSE;
> }
>
> - if (!encode_frame(dcc, &drawable->red_drawable->u.copy.src_area,
> - &image->u.bitmap, stream)) {
> - return FALSE;
> - }
> + if (!mjpeg_encoder_encode_frame(agent->mjpeg_encoder,
> + &drawable->red_drawable->u.copy.src_area,
> + &image->u.bitmap, stream->top_down)) {
> + return FALSE;
> + }
> n = mjpeg_encoder_end_frame(agent->mjpeg_encoder);
> dcc->send_data.stream_outbuf_size = outbuf_size;
>
> --
> 2.6.1
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20151021/911bb27e/attachment.sig>
More information about the Spice-devel
mailing list