[Spice-devel] [PATCH spice-server 1/2] Fix GStreamer encoding if stride is not 4 bytes aligned
Frediano Ziglio
fziglio at redhat.com
Wed Mar 22 15:04:27 UTC 2017
>
> Hi Frediano,
>
> On Wed, 2017-03-22 at 10:18 +0000, Frediano Ziglio wrote:
> > This is required by GStreamer.
>
> Is it related to the gstreamer bug you have opened recently ?
Not strictly, I was trying to reproduce the issue with chunks
and adapt my test script to not use a video on my pc (so could
be upstreamed).
The --split-lines option reproduce the chunks issue but changing
the video source size I started having this alignment issue due to
the fact that the width I was not multiple of 4.
> >
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > ---
> > server/gstreamer-encoder.c | 8 ++++++--
> > 1 file changed, 6 insertions(+), 2 deletions(-)
> >
> > diff --git a/server/gstreamer-encoder.c b/server/gstreamer-encoder.c
> > index df54cad..e637b8a 100644
> > --- a/server/gstreamer-encoder.c
> > +++ b/server/gstreamer-encoder.c
> > @@ -1260,7 +1260,7 @@ static inline int line_copy(SpiceGstEncoder
> > *encoder, const SpiceBitmap *bitmap,
> >
> > /* Copy the line */
> > uint8_t *src = chunks->chunk[chunk_index].data +
> > chunk_offset;
> > - memcpy(dst, src, stream_stride);
> > + memcpy(dst, src, MIN(stream_stride, bitmap->stride));
> > dst += stream_stride;
> > chunk_offset += bitmap->stride;
> > }
> > @@ -1351,7 +1351,7 @@ static int push_raw_frame(SpiceGstEncoder
> > *encoder,
> > {
> > uint32_t height = src->bottom - src->top;
> > uint32_t stream_stride = (src->right - src->left) * encoder-
> > >format->bpp / 8;
> > - uint32_t len = stream_stride * height;
> > + uint32_t len;
> > GstBuffer *buffer = gst_buffer_new();
> > /* TODO Use GST_MAP_INFO_INIT once GStreamer 1.4.5 is no longer
> > relevant */
> > GstMapInfo map = { .memory = NULL };
> > @@ -1362,6 +1362,10 @@ static int push_raw_frame(SpiceGstEncoder
> > *encoder,
> > uint32_t skip_lines = top_down ? src->top : bitmap->y - (src-
> > >bottom - 0);
> > uint32_t chunk_offset = bitmap->stride * skip_lines;
> >
> > + // GStreamer require the stream to be 4 bytes aligned
> > + stream_stride = (stream_stride + 3) & -4;
>
> (maybe it is just me but) imho is not easy to read binary operation
> with negative numbers. Can you switch to ~3
>
> Thanks,
> Pavel
>
No problem.
> > + len = stream_stride * height;
> > +
> > if (stream_stride != bitmap->stride) {
> > /* We have to do a line-by-line copy because for each we
> > have to
> > * leave out pixels on the left or right.
>
Frediano
More information about the Spice-devel
mailing list