diff mbox

[FFmpeg-devel,v2,1/6] avcodec/cbs_jpeg: Use memcpy when writing pictures

Message ID 20191119161234.3766-1-andreas.rheinhardt@gmail.com
State Accepted
Headers show

Commit Message

Andreas Rheinhardt Nov. 19, 2019, 4:12 p.m. UTC
This is possible because the size of a scan header is always a multiple
of a byte.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 libavcodec/cbs_jpeg.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

Andreas Rheinhardt Feb. 2, 2020, 6:12 a.m. UTC | #1
Andreas Rheinhardt:
> This is possible because the size of a scan header is always a multiple
> of a byte.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> ---
>  libavcodec/cbs_jpeg.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/libavcodec/cbs_jpeg.c b/libavcodec/cbs_jpeg.c
> index b189cbd9b7..64fe70beab 100644
> --- a/libavcodec/cbs_jpeg.c
> +++ b/libavcodec/cbs_jpeg.c
> @@ -330,7 +330,7 @@ static int cbs_jpeg_write_scan(CodedBitstreamContext *ctx,
>                                 PutBitContext *pbc)
>  {
>      JPEGRawScan *scan = unit->content;
> -    int i, err;
> +    int err;
>  
>      err = cbs_jpeg_write_scan_header(ctx, pbc, &scan->header);
>      if (err < 0)
> @@ -340,8 +340,12 @@ static int cbs_jpeg_write_scan(CodedBitstreamContext *ctx,
>          if (scan->data_size * 8 > put_bits_left(pbc))
>              return AVERROR(ENOSPC);
>  
> -        for (i = 0; i < scan->data_size; i++)
> -            put_bits(pbc, 8, scan->data[i]);
> +        av_assert0(put_bits_count(pbc) % 8 == 0);
> +
> +        flush_put_bits(pbc);
> +
> +        memcpy(put_bits_ptr(pbc), scan->data, scan->data_size);
> +        skip_put_bytes(pbc, scan->data_size);
>      }
>  
>      return 0;
> 
Ping.

- Andreas
Mark Thompson Feb. 9, 2020, 10:51 p.m. UTC | #2
On 19/11/2019 16:12, Andreas Rheinhardt wrote:
> This is possible because the size of a scan header is always a multiple
> of a byte.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> ---
>  libavcodec/cbs_jpeg.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/libavcodec/cbs_jpeg.c b/libavcodec/cbs_jpeg.c
> index b189cbd9b7..64fe70beab 100644
> --- a/libavcodec/cbs_jpeg.c
> +++ b/libavcodec/cbs_jpeg.c
> @@ -330,7 +330,7 @@ static int cbs_jpeg_write_scan(CodedBitstreamContext *ctx,
>                                 PutBitContext *pbc)
>  {
>      JPEGRawScan *scan = unit->content;
> -    int i, err;
> +    int err;
>  
>      err = cbs_jpeg_write_scan_header(ctx, pbc, &scan->header);
>      if (err < 0)
> @@ -340,8 +340,12 @@ static int cbs_jpeg_write_scan(CodedBitstreamContext *ctx,
>          if (scan->data_size * 8 > put_bits_left(pbc))
>              return AVERROR(ENOSPC);
>  
> -        for (i = 0; i < scan->data_size; i++)
> -            put_bits(pbc, 8, scan->data[i]);
> +        av_assert0(put_bits_count(pbc) % 8 == 0);
> +
> +        flush_put_bits(pbc);
> +
> +        memcpy(put_bits_ptr(pbc), scan->data, scan->data_size);
> +        skip_put_bytes(pbc, scan->data_size);
>      }
>  
>      return 0;
> 

Sure, applied.

Thanks,

- Mark
diff mbox

Patch

diff --git a/libavcodec/cbs_jpeg.c b/libavcodec/cbs_jpeg.c
index b189cbd9b7..64fe70beab 100644
--- a/libavcodec/cbs_jpeg.c
+++ b/libavcodec/cbs_jpeg.c
@@ -330,7 +330,7 @@  static int cbs_jpeg_write_scan(CodedBitstreamContext *ctx,
                                PutBitContext *pbc)
 {
     JPEGRawScan *scan = unit->content;
-    int i, err;
+    int err;
 
     err = cbs_jpeg_write_scan_header(ctx, pbc, &scan->header);
     if (err < 0)
@@ -340,8 +340,12 @@  static int cbs_jpeg_write_scan(CodedBitstreamContext *ctx,
         if (scan->data_size * 8 > put_bits_left(pbc))
             return AVERROR(ENOSPC);
 
-        for (i = 0; i < scan->data_size; i++)
-            put_bits(pbc, 8, scan->data[i]);
+        av_assert0(put_bits_count(pbc) % 8 == 0);
+
+        flush_put_bits(pbc);
+
+        memcpy(put_bits_ptr(pbc), scan->data, scan->data_size);
+        skip_put_bytes(pbc, scan->data_size);
     }
 
     return 0;