[FFmpeg-devel] [PATCH] avcodec/dpx: do not reset n_datum to 0 at end of row for packing 2

Carl Eugen Hoyos ceffmpeg at gmail.com
Wed Dec 5 19:40:19 EET 2018


2018-12-05 18:19 GMT+01:00, Paul B Mahol <onemda at gmail.com>:
> On 12/5/18, Carl Eugen Hoyos <ceffmpeg at gmail.com> wrote:
>> 2018-12-05 17:33 GMT+01:00, Paul B Mahol <onemda at gmail.com>:
>>> On 12/5/18, Carl Eugen Hoyos <ceffmpeg at gmail.com> wrote:
>>>> 2018-12-05 14:27 GMT+01:00, Paul B Mahol <onemda at gmail.com>:
>>>>> Fixes #4409.
>>>>>
>>>>> Signed-off-by: Paul B Mahol <onemda at gmail.com>
>>>>> ---
>>>>>  libavcodec/dpx.c | 3 ++-
>>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c
>>>>> index 538a1b9943..04b55ffadf 100644
>>>>> --- a/libavcodec/dpx.c
>>>>> +++ b/libavcodec/dpx.c
>>>>> @@ -378,7 +378,8 @@ static int decode_frame(AVCodecContext *avctx,
>>>>>                      read10in32(&buf, &rgbBuffer,
>>>>>                                 &n_datum, endian, shift);
>>>>>              }
>>>>> -            n_datum = 0;
>>>>> +            if (packing != 2)
>>>>> +                n_datum = 0;
>>>>>              for (i = 0; i < elements; i++)
>>>>>                  ptr[i] += p->linesize[i];
>>>>>          }
>>>>
>>>> This breaks decoding the output of the following command:
>>>> $ gm convert converted_image_gets_skewed.dpx -define
>>>> dpx:packing-method=b out.dpx
>>>
>>> I do not trust that app, its full of bugs.
>>
>> What is the reference for dpx in your opinion?
>
> ImageTragick certainly not.

That's not ImageMagick above.

The sample in question looks better with attached poc, breaks
four component sample, also attaching other samples that
show the difference.

Carl Eugen
-------------- next part --------------
diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c
index 538a1b9..b9e02e5 100644
--- a/libavcodec/dpx.c
+++ b/libavcodec/dpx.c
@@ -50,6 +50,8 @@ static unsigned int read32(const uint8_t **ptr, int is_big)
     return temp;
 }
 
+static int counter = 0;
+
 static uint16_t read10in32(const uint8_t **ptr, uint32_t * lbuf,
                                   int * n_datum, int is_big, int shift)
 {
@@ -60,9 +62,11 @@ static uint16_t read10in32(const uint8_t **ptr, uint32_t * lbuf,
         *n_datum = 2;
     }
 
-    *lbuf = *lbuf << 10 | *lbuf >> shift & 0x3FFFFF;
-
-    return *lbuf & 0x3FF;
+    if (*n_datum < 2)
+        *lbuf = *lbuf >> 10;
+if (counter++<30)
+printf("%x \n", *lbuf >> shift & 0x3FF);
+    return *lbuf >> shift & 0x3FF;
 }
 
 static uint16_t read12in32(const uint8_t **ptr, uint32_t * lbuf,
@@ -168,6 +172,7 @@ static int decode_frame(AVCodecContext *avctx,
     bits_per_color = buf[0];
     buf++;
     packing = read16(&buf, endian);
+printf("packing: %d, endian: %d, descriptor: %d, bpc: %d \n", packing, endian, descriptor, bits_per_color);
     encoding = read16(&buf, endian);
 
     if (encoding) {
@@ -310,6 +315,7 @@ static int decode_frame(AVCodecContext *avctx,
     case 51121:
         avctx->pix_fmt = AV_PIX_FMT_GBRAP12;
         break;
+    case 6100:
     case 6101:
         avctx->pix_fmt = AV_PIX_FMT_GRAY10;
         break;
@@ -363,20 +369,20 @@ static int decode_frame(AVCodecContext *avctx,
                                 (uint16_t*)ptr[1],
                                 (uint16_t*)ptr[2],
                                 (uint16_t*)ptr[3]};
-            int shift = packing == 1 ? 22 : 20;
+            int shift = packing == 1 ? 2 : 0;
             for (y = 0; y < avctx->width; y++) {
-                if (elements >= 3)
-                    *dst[2]++ = read10in32(&buf, &rgbBuffer,
-                                           &n_datum, endian, shift);
-                *dst[0]++ = read10in32(&buf, &rgbBuffer,
-                                       &n_datum, endian, shift);
-                if (elements >= 2)
-                    *dst[1]++ = read10in32(&buf, &rgbBuffer,
-                                           &n_datum, endian, shift);
                 if (elements == 4)
                     *dst[3]++ =
                     read10in32(&buf, &rgbBuffer,
                                &n_datum, endian, shift);
+                if (elements >= 2)
+                    *dst[1]++ = read10in32(&buf, &rgbBuffer,
+                                           &n_datum, endian, shift);
+                *dst[/*elements == 4 ? 2 :*/ 0]++ = read10in32(&buf, &rgbBuffer,
+                                       &n_datum, endian, shift);
+                if (elements >= 3)
+                    *dst[/*elements == 4 ? 0 :*/ 2]++ = read10in32(&buf, &rgbBuffer,
+                                           &n_datum, endian, shift);
             }
             n_datum = 0;
             for (i = 0; i < elements; i++)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: lenaBb.dpx
Type: application/octet-stream
Size: 96256 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20181205/f9c3cb6a/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: lenaBa.dpx
Type: application/octet-stream
Size: 96256 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20181205/f9c3cb6a/attachment-0001.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: lenaLb.dpx
Type: application/octet-stream
Size: 96256 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20181205/f9c3cb6a/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: lenaLa.dpx
Type: application/octet-stream
Size: 96256 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20181205/f9c3cb6a/attachment-0003.obj>


More information about the ffmpeg-devel mailing list