diff mbox

[FFmpeg-devel] libavformat/aac: Parse all ID3 tags present between ADTS frames

Message ID e1a77c9a-2ead-2b98-e5ac-4bfa78038609@avm.se
State Superseded
Headers show

Commit Message

Mattias Amnefelt April 3, 2018, 5:58 a.m. UTC
Yes, my feeling was also that it's better to handle this when possible.

You are of course correct that the two tags needs to be inbetween 
frames. Sorry about that, I stripped the sample down too much. I updated 
with a sample which has two frames. This new sample fails the test 
without the patch.

/mattiasa

On 2018-04-02 23:25, Richard Shaffer wrote:
> It seems like some software can insert an additional ID3v2 tag instead
> of appending a frame to an existing one. One could argue that that is
> somewhat broken, but I agree it's better to handle it instead of
> returning an error. The changes in aacdec.c look ok to me.
>
> The fate sample you provided has two tags at the beginning of the
> file. These will actually get parsed by avformat_open_input calling
> ff_id3v2_read_dict and not by the adts demuxer. The ff_id3v2_read_dict
> code path will already parse multiple tags, which is why the test
> passes. In order to exercise your code change, the ID3v2 tags would
> have to be between ADTS frames.
>
> -Richard
>
> On Mon, Apr 2, 2018 at 4:35 AM, Mattias Amnefelt <mattiasa@avm.se> wrote:
>> This is a follow-up to https://patchwork.ffmpeg.org/patch/7477/ and changes
>> so all ID3 tags between ADTS frames gets parsed, not just the first one.
>>
>> Sample media for the included fate test is available at
>> http://mattias.amnefe.lt/tmp/id3v2_two_tags.aac
>>
>>
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
From 8d587983b6cc5c535e29f0898d4cac433cd0a609 Mon Sep 17 00:00:00 2001
From: Mattias Amnefelt <mattiasa@avm.se>
Date: Mon, 2 Apr 2018 11:30:40 +0200
Subject: [PATCH] libavformat/aac: Parse all ID3 tags present between ADTS
 frames

Some ADTS streams can have multiple ID3 tags between frames. This
change parses all of them, rather than just the first one.

Signed-off-by: Mattias Amnefelt <mattiasa@avm.se>
---
 libavformat/aacdec.c                     |  14 +-
 tests/fate/demux.mak                     |   3 +-
 tests/ref/fate/adts-id3v2-two-tags-demux | 475 +++++++++++++++++++++++++++++++
 3 files changed, 486 insertions(+), 6 deletions(-)
 create mode 100644 tests/ref/fate/adts-id3v2-two-tags-demux

Comments

Michael Niedermayer April 4, 2018, 12:28 a.m. UTC | #1
On Tue, Apr 03, 2018 at 07:58:53AM +0200, Mattias Amnefelt wrote:
> Yes, my feeling was also that it's better to handle this when possible.
> 
> You are of course correct that the two tags needs to be inbetween frames.
> Sorry about that, I stripped the sample down too much. I updated with a
> sample which has two frames. This new sample fails the test without the
> patch.
> 
> /mattiasa
> 
> On 2018-04-02 23:25, Richard Shaffer wrote:
> >It seems like some software can insert an additional ID3v2 tag instead
> >of appending a frame to an existing one. One could argue that that is
> >somewhat broken, but I agree it's better to handle it instead of
> >returning an error. The changes in aacdec.c look ok to me.
> >
> >The fate sample you provided has two tags at the beginning of the
> >file. These will actually get parsed by avformat_open_input calling
> >ff_id3v2_read_dict and not by the adts demuxer. The ff_id3v2_read_dict
> >code path will already parse multiple tags, which is why the test
> >passes. In order to exercise your code change, the ID3v2 tags would
> >have to be between ADTS frames.
> >
> >-Richard
> >
> >On Mon, Apr 2, 2018 at 4:35 AM, Mattias Amnefelt <mattiasa@avm.se> wrote:
> >>This is a follow-up to https://patchwork.ffmpeg.org/patch/7477/ and changes
> >>so all ID3 tags between ADTS frames gets parsed, not just the first one.
> >>
> >>Sample media for the included fate test is available at
> >>http://mattias.amnefe.lt/tmp/id3v2_two_tags.aac
> >>
> >>
> >>
> >>_______________________________________________
> >>ffmpeg-devel mailing list
> >>ffmpeg-devel@ffmpeg.org
> >>http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >>
> >_______________________________________________
> >ffmpeg-devel mailing list
> >ffmpeg-devel@ffmpeg.org
> >http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> 

>  libavformat/aacdec.c                     |   14 
>  tests/fate/demux.mak                     |    3 
>  tests/ref/fate/adts-id3v2-two-tags-demux |  475 +++++++++++++++++++++++++++++++
>  3 files changed, 486 insertions(+), 6 deletions(-)
> 95d2c77bc7fa82503377e09da98fe17e1b3eb302  0001-libavformat-aac-Parse-all-ID3-tags-present-between-A.patch
> From 8d587983b6cc5c535e29f0898d4cac433cd0a609 Mon Sep 17 00:00:00 2001
> From: Mattias Amnefelt <mattiasa@avm.se>
> Date: Mon, 2 Apr 2018 11:30:40 +0200
> Subject: [PATCH] libavformat/aac: Parse all ID3 tags present between ADTS
>  frames
> 
> Some ADTS streams can have multiple ID3 tags between frames. This
> change parses all of them, rather than just the first one.

uploaded aac fate sample

the patch should be ok

thx

[...]
Carl Eugen Hoyos April 4, 2018, 1:33 a.m. UTC | #2
2018-04-03 7:58 GMT+02:00, Mattias Amnefelt <mattiasa@avm.se>:
> Yes, my feeling was also that it's better to handle this when possible.
>
> You are of course correct that the two tags needs to be inbetween
> frames. Sorry about that, I stripped the sample down too much. I updated
> with a sample which has two frames. This new sample fails the test
> without the patch.

> +fate-adts-id3v2-two-tags-demux: CMD = framecrc -f aac -i $(TARGET_SAMPLES)/aac/id3v2_two_tags.aac -c:a copy

The "-f aac" looks like a bad idea to me.
It's also true for the tests above, but that's still not reason to
add more.

Please avoid top-posting here, Carl Eugen
James Almer April 4, 2018, 1:38 a.m. UTC | #3
On 4/3/2018 10:33 PM, Carl Eugen Hoyos wrote:
> 2018-04-03 7:58 GMT+02:00, Mattias Amnefelt <mattiasa@avm.se>:
>> Yes, my feeling was also that it's better to handle this when possible.
>>
>> You are of course correct that the two tags needs to be inbetween
>> frames. Sorry about that, I stripped the sample down too much. I updated
>> with a sample which has two frames. This new sample fails the test
>> without the patch.
> 
>> +fate-adts-id3v2-two-tags-demux: CMD = framecrc -f aac -i $(TARGET_SAMPLES)/aac/id3v2_two_tags.aac -c:a copy
> 
> The "-f aac" looks like a bad idea to me.
> It's also true for the tests above, but that's still not reason to
> add more.
> 
> Please avoid top-posting here, Carl Eugen

At least in one of them it was added because the sample had too few
frames and probing was detecting it with a score of 1, which seemed too
fragile.
If that's not the case with this new sample then i agree with you it's
not a good idea.
Carl Eugen Hoyos April 4, 2018, 1:40 a.m. UTC | #4
2018-04-04 3:38 GMT+02:00, James Almer <jamrial@gmail.com>:
> On 4/3/2018 10:33 PM, Carl Eugen Hoyos wrote:
>> 2018-04-03 7:58 GMT+02:00, Mattias Amnefelt <mattiasa@avm.se>:
>>> Yes, my feeling was also that it's better to handle this when possible.
>>>
>>> You are of course correct that the two tags needs to be inbetween
>>> frames. Sorry about that, I stripped the sample down too much. I updated
>>> with a sample which has two frames. This new sample fails the test
>>> without the patch.
>>
>>> +fate-adts-id3v2-two-tags-demux: CMD = framecrc -f aac -i
>>> $(TARGET_SAMPLES)/aac/id3v2_two_tags.aac -c:a copy
>>
>> The "-f aac" looks like a bad idea to me.
>> It's also true for the tests above, but that's still not reason to
>> add more.
>>
>> Please avoid top-posting here, Carl Eugen
>
> At least in one of them it was added because the sample had too few
> frames and probing was detecting it with a score of 1, which seemed too
> fragile.

I believe that it is good to have a sample that is detected with
a small score as part of fate.

Carl Eugen
James Almer April 4, 2018, 1:42 a.m. UTC | #5
On 4/3/2018 10:40 PM, Carl Eugen Hoyos wrote:
> 2018-04-04 3:38 GMT+02:00, James Almer <jamrial@gmail.com>:
>> On 4/3/2018 10:33 PM, Carl Eugen Hoyos wrote:
>>> 2018-04-03 7:58 GMT+02:00, Mattias Amnefelt <mattiasa@avm.se>:
>>>> Yes, my feeling was also that it's better to handle this when possible.
>>>>
>>>> You are of course correct that the two tags needs to be inbetween
>>>> frames. Sorry about that, I stripped the sample down too much. I updated
>>>> with a sample which has two frames. This new sample fails the test
>>>> without the patch.
>>>
>>>> +fate-adts-id3v2-two-tags-demux: CMD = framecrc -f aac -i
>>>> $(TARGET_SAMPLES)/aac/id3v2_two_tags.aac -c:a copy
>>>
>>> The "-f aac" looks like a bad idea to me.
>>> It's also true for the tests above, but that's still not reason to
>>> add more.
>>>
>>> Please avoid top-posting here, Carl Eugen
>>
>> At least in one of them it was added because the sample had too few
>> frames and probing was detecting it with a score of 1, which seemed too
>> fragile.
> 
> I believe that it is good to have a sample that is detected with
> a small score as part of fate.
> 
> Carl Eugen

When i asked it was suggested to just force the demuxer. I have no
opinion one way or another, so feel free to change it.
Mattias Amnefelt April 4, 2018, 7:22 a.m. UTC | #6
On 2018-04-04 03:42, James Almer wrote:
> On 4/3/2018 10:40 PM, Carl Eugen Hoyos wrote:
>> 2018-04-04 3:38 GMT+02:00, James Almer <jamrial@gmail.com>:
>>> On 4/3/2018 10:33 PM, Carl Eugen Hoyos wrote:
>>>> 2018-04-03 7:58 GMT+02:00, Mattias Amnefelt <mattiasa@avm.se>:
>>>>> Yes, my feeling was also that it's better to handle this when possible.
>>>>>
>>>>> You are of course correct that the two tags needs to be inbetween
>>>>> frames. Sorry about that, I stripped the sample down too much. I updated
>>>>> with a sample which has two frames. This new sample fails the test
>>>>> without the patch.
>>>>> +fate-adts-id3v2-two-tags-demux: CMD = framecrc -f aac -i
>>>>> $(TARGET_SAMPLES)/aac/id3v2_two_tags.aac -c:a copy
>>>> The "-f aac" looks like a bad idea to me.
>>>> It's also true for the tests above, but that's still not reason to
>>>> add more.
>>>>
>>>> Please avoid top-posting here, Carl Eugen
>>> At least in one of them it was added because the sample had too few
>>> frames and probing was detecting it with a score of 1, which seemed too
>>> fragile.
>> I believe that it is good to have a sample that is detected with
>> a small score as part of fate.
>>
>> Carl Eugen
> When i asked it was suggested to just force the demuxer. I have no
> opinion one way or another, so feel free to change it.
I have to admit I just copy-n-pasted the test above. I just 
double-checked and all the id3 tag tests pass without -f aac now. I'm 
not sure if anything has changed since the test was added or not. Do you 
want a patch which removes it for all of them?

/mattiasa
diff mbox

Patch

diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c
index 5ec706bdc7..685458b911 100644
--- a/libavformat/aacdec.c
+++ b/libavformat/aacdec.c
@@ -154,11 +154,15 @@  static int adts_aac_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     int ret, fsize;
 
-    ret = av_get_packet(s->pb, pkt, FFMAX(ID3v2_HEADER_SIZE, ADTS_HEADER_SIZE));
-
-    if (ret >= ID3v2_HEADER_SIZE && ff_id3v2_match(pkt->data, ID3v2_DEFAULT_MAGIC)) {
-        if ((ret = handle_id3(s, pkt)) >= 0)
-            ret = av_get_packet(s->pb, pkt, ADTS_HEADER_SIZE);
+    // Parse all the ID3 headers between frames
+    while (1) {
+        ret = av_get_packet(s->pb, pkt, FFMAX(ID3v2_HEADER_SIZE, ADTS_HEADER_SIZE));
+        if (ret >= ID3v2_HEADER_SIZE && ff_id3v2_match(pkt->data, ID3v2_DEFAULT_MAGIC)) {
+            if ((ret = handle_id3(s, pkt)) >= 0) {
+                continue;
+            }
+        }
+        break;
     }
 
     if (ret < 0)
diff --git a/tests/fate/demux.mak b/tests/fate/demux.mak
index 306904b9de..fc581f81ad 100644
--- a/tests/fate/demux.mak
+++ b/tests/fate/demux.mak
@@ -1,10 +1,11 @@ 
 FATE_SAMPLES_DEMUX-$(call DEMDEC, AVI, FRAPS) += fate-avio-direct
 fate-avio-direct: CMD = framecrc -avioflags direct -i $(TARGET_SAMPLES)/fraps/fraps-v5-bouncing-balls-partial.avi -avioflags direct
 
-FATE_SAMPLES_DEMUX-$(call DEMDEC, AAC, AAC) += fate-adts-demux fate-adts-id3v1-demux fate-adts-id3v2-demux
+FATE_SAMPLES_DEMUX-$(call DEMDEC, AAC, AAC) += fate-adts-demux fate-adts-id3v1-demux fate-adts-id3v2-demux fate-adts-id3v2-two-tags-demux
 fate-adts-demux: CMD = crc -i $(TARGET_SAMPLES)/aac/ct_faac-adts.aac -c:a copy
 fate-adts-id3v1-demux: CMD = framecrc -f aac -i $(TARGET_SAMPLES)/aac/id3v1.aac -c:a copy
 fate-adts-id3v2-demux: CMD = framecrc -f aac -i $(TARGET_SAMPLES)/aac/id3v2.aac -c:a copy
+fate-adts-id3v2-two-tags-demux: CMD = framecrc -f aac -i $(TARGET_SAMPLES)/aac/id3v2_two_tags.aac -c:a copy
 
 FATE_SAMPLES_DEMUX-$(CONFIG_AEA_DEMUXER) += fate-aea-demux
 fate-aea-demux: CMD = crc -i $(TARGET_SAMPLES)/aea/chirp.aea -c:a copy
diff --git a/tests/ref/fate/adts-id3v2-two-tags-demux b/tests/ref/fate/adts-id3v2-two-tags-demux
new file mode 100644
index 0000000000..4fffd2e767
--- /dev/null
+++ b/tests/ref/fate/adts-id3v2-two-tags-demux
@@ -0,0 +1,475 @@ 
+#tb 0: 1/28224000
+#media_type 0: audio
+#codec_id 0: aac
+#sample_rate 0: 48000
+#channel_layout 0: 4
+#channel_layout_name 0: mono
+0,          0,          0,   602112,      128, 0x23291993
+0,     602112,     602112,   602112,      128, 0x23291993
+0,    1204224,    1204224,   602112,      128, 0x23291993
+0,    1806336,    1806336,   602112,      128, 0x23291993
+0,    2408448,    2408448,   602112,      128, 0x23291993
+0,    3010560,    3010560,   602112,      128, 0x23291993
+0,    3612672,    3612672,   602112,      128, 0x23291993
+0,    4214784,    4214784,   602112,      128, 0x23291993
+0,    4816896,    4816896,   602112,      128, 0x23291993
+0,    5419008,    5419008,   602112,      128, 0x23291993
+0,    6021120,    6021120,   602112,      128, 0x23291993
+0,    6623232,    6623232,   602112,      128, 0x23291993
+0,    7225344,    7225344,   602112,      128, 0x23291993
+0,    7827456,    7827456,   602112,      128, 0x23291993
+0,    8429568,    8429568,   602112,      128, 0x23291993
+0,    9031680,    9031680,   602112,      128, 0x23291993
+0,    9633792,    9633792,   602112,      128, 0x23291993
+0,   10235904,   10235904,   602112,      128, 0x23291993
+0,   10838016,   10838016,   602112,      128, 0x23291993
+0,   11440128,   11440128,   602112,      128, 0x23291993
+0,   12042240,   12042240,   602112,      128, 0x23291993
+0,   12644352,   12644352,   602112,      128, 0x23291993
+0,   13246464,   13246464,   602112,      128, 0x23291993
+0,   13848576,   13848576,   602112,      128, 0x23291993
+0,   14450688,   14450688,   602112,      128, 0x23291993
+0,   15052800,   15052800,   602112,      128, 0x23291993
+0,   15654912,   15654912,   602112,      128, 0x23291993
+0,   16257024,   16257024,   602112,      128, 0x23291993
+0,   16859136,   16859136,   602112,      128, 0x23291993
+0,   17461248,   17461248,   602112,      128, 0x23291993
+0,   18063360,   18063360,   602112,      128, 0x23291993
+0,   18665472,   18665472,   602112,      128, 0x23291993
+0,   19267584,   19267584,   602112,      128, 0x23291993
+0,   19869696,   19869696,   602112,      128, 0x23291993
+0,   20471808,   20471808,   602112,      128, 0x23291993
+0,   21073920,   21073920,   602112,      128, 0x23291993
+0,   21676032,   21676032,   602112,      128, 0x23291993
+0,   22278144,   22278144,   602112,      128, 0x23291993
+0,   22880256,   22880256,   602112,      128, 0x23291993
+0,   23482368,   23482368,   602112,      128, 0x23291993
+0,   24084480,   24084480,   602112,      128, 0x23291993
+0,   24686592,   24686592,   602112,      128, 0x23291993
+0,   25288704,   25288704,   602112,      128, 0x23291993
+0,   25890816,   25890816,   602112,      128, 0x23291993
+0,   26492928,   26492928,   602112,      128, 0x23291993
+0,   27095040,   27095040,   602112,      128, 0x23291993
+0,   27697152,   27697152,   602112,      128, 0x23291993
+0,   28299264,   28299264,   602112,      128, 0x23291993
+0,   28901376,   28901376,   602112,      128, 0x23291993
+0,   29503488,   29503488,   602112,      128, 0x23291993
+0,   30105600,   30105600,   602112,      128, 0x23291993
+0,   30707712,   30707712,   602112,      128, 0x23291993
+0,   31309824,   31309824,   602112,      128, 0x23291993
+0,   31911936,   31911936,   602112,      128, 0x23291993
+0,   32514048,   32514048,   602112,      128, 0x23291993
+0,   33116160,   33116160,   602112,      128, 0x23291993
+0,   33718272,   33718272,   602112,      128, 0x23291993
+0,   34320384,   34320384,   602112,      128, 0x23291993
+0,   34922496,   34922496,   602112,      128, 0x23291993
+0,   35524608,   35524608,   602112,      128, 0x23291993
+0,   36126720,   36126720,   602112,      128, 0x23291993
+0,   36728832,   36728832,   602112,      128, 0x23291993
+0,   37330944,   37330944,   602112,      128, 0x23291993
+0,   37933056,   37933056,   602112,      128, 0x23291993
+0,   38535168,   38535168,   602112,      128, 0x23291993
+0,   39137280,   39137280,   602112,      128, 0x23291993
+0,   39739392,   39739392,   602112,      128, 0x23291993
+0,   40341504,   40341504,   602112,      128, 0x23291993
+0,   40943616,   40943616,   602112,      128, 0x23291993
+0,   41545728,   41545728,   602112,      128, 0x23291993
+0,   42147840,   42147840,   602112,      128, 0x23291993
+0,   42749952,   42749952,   602112,      128, 0x23291993
+0,   43352064,   43352064,   602112,      128, 0x23291993
+0,   43954176,   43954176,   602112,      128, 0x23291993
+0,   44556288,   44556288,   602112,      128, 0x23291993
+0,   45158400,   45158400,   602112,      128, 0x23291993
+0,   45760512,   45760512,   602112,      128, 0x23291993
+0,   46362624,   46362624,   602112,      128, 0x23291993
+0,   46964736,   46964736,   602112,      128, 0x23291993
+0,   47566848,   47566848,   602112,      128, 0x23291993
+0,   48168960,   48168960,   602112,      128, 0x23291993
+0,   48771072,   48771072,   602112,      128, 0x23291993
+0,   49373184,   49373184,   602112,      128, 0x23291993
+0,   49975296,   49975296,   602112,      128, 0x23291993
+0,   50577408,   50577408,   602112,      128, 0x23291993
+0,   51179520,   51179520,   602112,      128, 0x23291993
+0,   51781632,   51781632,   602112,      128, 0x23291993
+0,   52383744,   52383744,   602112,      128, 0x23291993
+0,   52985856,   52985856,   602112,      128, 0x23291993
+0,   53587968,   53587968,   602112,      128, 0x23291993
+0,   54190080,   54190080,   602112,      128, 0x23291993
+0,   54792192,   54792192,   602112,      128, 0x23291993
+0,   55394304,   55394304,   602112,      128, 0x23291993
+0,   55996416,   55996416,   602112,      128, 0x23291993
+0,   56598528,   56598528,   602112,      128, 0x23291993
+0,   57200640,   57200640,   602112,      128, 0x23291993
+0,   57802752,   57802752,   602112,      128, 0x23291993
+0,   58404864,   58404864,   602112,      128, 0x23291993
+0,   59006976,   59006976,   602112,      128, 0x23291993
+0,   59609088,   59609088,   602112,      128, 0x23291993
+0,   60211200,   60211200,   602112,      128, 0x23291993
+0,   60813312,   60813312,   602112,      128, 0x23291993
+0,   61415424,   61415424,   602112,      128, 0x23291993
+0,   62017536,   62017536,   602112,      128, 0x23291993
+0,   62619648,   62619648,   602112,      128, 0x23291993
+0,   63221760,   63221760,   602112,      128, 0x23291993
+0,   63823872,   63823872,   602112,      128, 0x23291993
+0,   64425984,   64425984,   602112,      128, 0x23291993
+0,   65028096,   65028096,   602112,      128, 0x23291993
+0,   65630208,   65630208,   602112,      128, 0x23291993
+0,   66232320,   66232320,   602112,      128, 0x23291993
+0,   66834432,   66834432,   602112,      128, 0x23291993
+0,   67436544,   67436544,   602112,      128, 0x23291993
+0,   68038656,   68038656,   602112,      128, 0x23291993
+0,   68640768,   68640768,   602112,      128, 0x23291993
+0,   69242880,   69242880,   602112,      128, 0x23291993
+0,   69844992,   69844992,   602112,      128, 0x23291993
+0,   70447104,   70447104,   602112,      128, 0x23291993
+0,   71049216,   71049216,   602112,      128, 0x23291993
+0,   71651328,   71651328,   602112,      128, 0x23291993
+0,   72253440,   72253440,   602112,      128, 0x23291993
+0,   72855552,   72855552,   602112,      128, 0x23291993
+0,   73457664,   73457664,   602112,      128, 0x23291993
+0,   74059776,   74059776,   602112,      128, 0x23291993
+0,   74661888,   74661888,   602112,      128, 0x23291993
+0,   75264000,   75264000,   602112,      128, 0x23291993
+0,   75866112,   75866112,   602112,      128, 0x23291993
+0,   76468224,   76468224,   602112,      128, 0x23291993
+0,   77070336,   77070336,   602112,      128, 0x23291993
+0,   77672448,   77672448,   602112,      128, 0x23291993
+0,   78274560,   78274560,   602112,      128, 0x23291993
+0,   78876672,   78876672,   602112,      128, 0x23291993
+0,   79478784,   79478784,   602112,      128, 0x23291993
+0,   80080896,   80080896,   602112,      128, 0x23291993
+0,   80683008,   80683008,   602112,      128, 0x23291993
+0,   81285120,   81285120,   602112,      128, 0x23291993
+0,   81887232,   81887232,   602112,      128, 0x23291993
+0,   82489344,   82489344,   602112,      128, 0x23291993
+0,   83091456,   83091456,   602112,      128, 0x23291993
+0,   83693568,   83693568,   602112,      128, 0x23291993
+0,   84295680,   84295680,   602112,      128, 0x23291993
+0,   84897792,   84897792,   602112,      128, 0x23291993
+0,   85499904,   85499904,   602112,      128, 0x23291993
+0,   86102016,   86102016,   602112,      128, 0x23291993
+0,   86704128,   86704128,   602112,      128, 0x23291993
+0,   87306240,   87306240,   602112,      128, 0x23291993
+0,   87908352,   87908352,   602112,      128, 0x23291993
+0,   88510464,   88510464,   602112,      128, 0x23291993
+0,   89112576,   89112576,   602112,      128, 0x23291993
+0,   89714688,   89714688,   602112,      128, 0x23291993
+0,   90316800,   90316800,   602112,      128, 0x23291993
+0,   90918912,   90918912,   602112,      128, 0x23291993
+0,   91521024,   91521024,   602112,      128, 0x23291993
+0,   92123136,   92123136,   602112,      128, 0x23291993
+0,   92725248,   92725248,   602112,      128, 0x23291993
+0,   93327360,   93327360,   602112,      128, 0x23291993
+0,   93929472,   93929472,   602112,      128, 0x23291993
+0,   94531584,   94531584,   602112,      128, 0x23291993
+0,   95133696,   95133696,   602112,      128, 0x23291993
+0,   95735808,   95735808,   602112,      128, 0x23291993
+0,   96337920,   96337920,   602112,      128, 0x23291993
+0,   96940032,   96940032,   602112,      128, 0x23291993
+0,   97542144,   97542144,   602112,      128, 0x23291993
+0,   98144256,   98144256,   602112,      128, 0x23291993
+0,   98746368,   98746368,   602112,      128, 0x23291993
+0,   99348480,   99348480,   602112,      128, 0x23291993
+0,   99950592,   99950592,   602112,      128, 0x23291993
+0,  100552704,  100552704,   602112,      128, 0x23291993
+0,  101154816,  101154816,   602112,      128, 0x23291993
+0,  101756928,  101756928,   602112,      128, 0x23291993
+0,  102359040,  102359040,   602112,      128, 0x23291993
+0,  102961152,  102961152,   602112,      128, 0x23291993
+0,  103563264,  103563264,   602112,      128, 0x23291993
+0,  104165376,  104165376,   602112,      128, 0x23291993
+0,  104767488,  104767488,   602112,      128, 0x23291993
+0,  105369600,  105369600,   602112,      128, 0x23291993
+0,  105971712,  105971712,   602112,      128, 0x23291993
+0,  106573824,  106573824,   602112,      128, 0x23291993
+0,  107175936,  107175936,   602112,      128, 0x23291993
+0,  107778048,  107778048,   602112,      128, 0x23291993
+0,  108380160,  108380160,   602112,      128, 0x23291993
+0,  108982272,  108982272,   602112,      128, 0x23291993
+0,  109584384,  109584384,   602112,      128, 0x23291993
+0,  110186496,  110186496,   602112,      128, 0x23291993
+0,  110788608,  110788608,   602112,      128, 0x23291993
+0,  111390720,  111390720,   602112,      128, 0x23291993
+0,  111992832,  111992832,   602112,      128, 0x23291993
+0,  112594944,  112594944,   602112,      128, 0x23291993
+0,  113197056,  113197056,   602112,      128, 0x23291993
+0,  113799168,  113799168,   602112,      128, 0x23291993
+0,  114401280,  114401280,   602112,      128, 0x23291993
+0,  115003392,  115003392,   602112,      128, 0x23291993
+0,  115605504,  115605504,   602112,      128, 0x23291993
+0,  116207616,  116207616,   602112,      128, 0x23291993
+0,  116809728,  116809728,   602112,      128, 0x23291993
+0,  117411840,  117411840,   602112,      128, 0x23291993
+0,  118013952,  118013952,   602112,      128, 0x23291993
+0,  118616064,  118616064,   602112,      128, 0x23291993
+0,  119218176,  119218176,   602112,      128, 0x23291993
+0,  119820288,  119820288,   602112,      128, 0x23291993
+0,  120422400,  120422400,   602112,      128, 0x23291993
+0,  121024512,  121024512,   602112,      128, 0x23291993
+0,  121626624,  121626624,   602112,      128, 0x23291993
+0,  122228736,  122228736,   602112,      128, 0x23291993
+0,  122830848,  122830848,   602112,      128, 0x23291993
+0,  123432960,  123432960,   602112,      128, 0x23291993
+0,  124035072,  124035072,   602112,      128, 0x23291993
+0,  124637184,  124637184,   602112,      128, 0x23291993
+0,  125239296,  125239296,   602112,      128, 0x23291993
+0,  125841408,  125841408,   602112,      128, 0x23291993
+0,  126443520,  126443520,   602112,      128, 0x23291993
+0,  127045632,  127045632,   602112,      128, 0x23291993
+0,  127647744,  127647744,   602112,      128, 0x23291993
+0,  128249856,  128249856,   602112,      128, 0x23291993
+0,  128851968,  128851968,   602112,      128, 0x23291993
+0,  129454080,  129454080,   602112,      128, 0x23291993
+0,  130056192,  130056192,   602112,      128, 0x23291993
+0,  130658304,  130658304,   602112,      128, 0x23291993
+0,  131260416,  131260416,   602112,      128, 0x23291993
+0,  131862528,  131862528,   602112,      128, 0x23291993
+0,  132464640,  132464640,   602112,      128, 0x23291993
+0,  133066752,  133066752,   602112,      128, 0x23291993
+0,  133668864,  133668864,   602112,      128, 0x23291993
+0,  134270976,  134270976,   602112,      128, 0x23291993
+0,  134873088,  134873088,   602112,      128, 0x23291993
+0,  135475200,  135475200,   602112,      128, 0x23291993
+0,  136077312,  136077312,   602112,      128, 0x23291993
+0,  136679424,  136679424,   602112,      128, 0x23291993
+0,  137281536,  137281536,   602112,      128, 0x23291993
+0,  137883648,  137883648,   602112,      128, 0x23291993
+0,  138485760,  138485760,   602112,      128, 0x23291993
+0,  139087872,  139087872,   602112,      128, 0x23291993
+0,  139689984,  139689984,   602112,      128, 0x23291993
+0,  140292096,  140292096,   602112,      128, 0x23291993
+0,  140894208,  140894208,   602112,      128, 0x23291993
+0,  141496320,  141496320,   602112,      128, 0x23291993
+0,  142098432,  142098432,   602112,      128, 0x23291993
+0,  142700544,  142700544,   602112,      128, 0x23291993
+0,  143302656,  143302656,   602112,      128, 0x23291993
+0,  143904768,  143904768,   602112,      128, 0x23291993
+0,  144506880,  144506880,   602112,      128, 0x23291993
+0,  145108992,  145108992,   602112,      128, 0x23291993
+0,  145711104,  145711104,   602112,      128, 0x23291993
+0,  146313216,  146313216,   602112,      128, 0x23291993
+0,  146915328,  146915328,   602112,      128, 0x23291993
+0,  147517440,  147517440,   602112,      128, 0x23291993
+0,  148119552,  148119552,   602112,      128, 0x23291993
+0,  148721664,  148721664,   602112,      128, 0x23291993
+0,  149323776,  149323776,   602112,      128, 0x23291993
+0,  149925888,  149925888,   602112,      128, 0x23291993
+0,  150528000,  150528000,   602112,      128, 0x23291993
+0,  151130112,  151130112,   602112,      128, 0x23291993
+0,  151732224,  151732224,   602112,      128, 0x23291993
+0,  152334336,  152334336,   602112,      128, 0x23291993
+0,  152936448,  152936448,   602112,      128, 0x23291993
+0,  153538560,  153538560,   602112,      128, 0x23291993
+0,  154140672,  154140672,   602112,      128, 0x23291993
+0,  154742784,  154742784,   602112,      128, 0x23291993
+0,  155344896,  155344896,   602112,      128, 0x23291993
+0,  155947008,  155947008,   602112,      128, 0x23291993
+0,  156549120,  156549120,   602112,      128, 0x23291993
+0,  157151232,  157151232,   602112,      128, 0x23291993
+0,  157753344,  157753344,   602112,      128, 0x23291993
+0,  158355456,  158355456,   602112,      128, 0x23291993
+0,  158957568,  158957568,   602112,      128, 0x23291993
+0,  159559680,  159559680,   602112,      128, 0x23291993
+0,  160161792,  160161792,   602112,      128, 0x23291993
+0,  160763904,  160763904,   602112,      128, 0x23291993
+0,  161366016,  161366016,   602112,      128, 0x23291993
+0,  161968128,  161968128,   602112,      128, 0x23291993
+0,  162570240,  162570240,   602112,      128, 0x23291993
+0,  163172352,  163172352,   602112,      128, 0x23291993
+0,  163774464,  163774464,   602112,      128, 0x23291993
+0,  164376576,  164376576,   602112,      128, 0x23291993
+0,  164978688,  164978688,   602112,      128, 0x23291993
+0,  165580800,  165580800,   602112,      128, 0x23291993
+0,  166182912,  166182912,   602112,      128, 0x23291993
+0,  166785024,  166785024,   602112,      128, 0x23291993
+0,  167387136,  167387136,   602112,      128, 0x23291993
+0,  167989248,  167989248,   602112,      128, 0x23291993
+0,  168591360,  168591360,   602112,      128, 0x23291993
+0,  169193472,  169193472,   602112,      128, 0x23291993
+0,  169795584,  169795584,   602112,      128, 0x23291993
+0,  170397696,  170397696,   602112,      128, 0x23291993
+0,  170999808,  170999808,   602112,      128, 0x23291993
+0,  171601920,  171601920,   602112,      128, 0x23291993
+0,  172204032,  172204032,   602112,      128, 0x23291993
+0,  172806144,  172806144,   602112,      128, 0x23291993
+0,  173408256,  173408256,   602112,      128, 0x23291993
+0,  174010368,  174010368,   602112,      128, 0x23291993
+0,  174612480,  174612480,   602112,      128, 0x23291993
+0,  175214592,  175214592,   602112,      128, 0x23291993
+0,  175816704,  175816704,   602112,      128, 0x23291993
+0,  176418816,  176418816,   602112,      128, 0x23291993
+0,  177020928,  177020928,   602112,      128, 0x23291993
+0,  177623040,  177623040,   602112,      128, 0x23291993
+0,  178225152,  178225152,   602112,      128, 0x23291993
+0,  178827264,  178827264,   602112,      128, 0x23291993
+0,  179429376,  179429376,   602112,      128, 0x23291993
+0,  180031488,  180031488,   602112,      128, 0x23291993
+0,  180633600,  180633600,   602112,      128, 0x23291993
+0,  181235712,  181235712,   602112,      128, 0x23291993
+0,  181837824,  181837824,   602112,      128, 0x23291993
+0,  182439936,  182439936,   602112,      128, 0x23291993
+0,  183042048,  183042048,   602112,      128, 0x23291993
+0,  183644160,  183644160,   602112,      128, 0x23291993
+0,  184246272,  184246272,   602112,      128, 0x23291993
+0,  184848384,  184848384,   602112,      128, 0x23291993
+0,  185450496,  185450496,   602112,      128, 0x23291993
+0,  186052608,  186052608,   602112,      128, 0x23291993
+0,  186654720,  186654720,   602112,      128, 0x23291993
+0,  187256832,  187256832,   602112,      128, 0x23291993
+0,  187858944,  187858944,   602112,      128, 0x23291993
+0,  188461056,  188461056,   602112,      128, 0x23291993
+0,  189063168,  189063168,   602112,      128, 0x23291993
+0,  189665280,  189665280,   602112,      128, 0x23291993
+0,  190267392,  190267392,   602112,      128, 0x23291993
+0,  190869504,  190869504,   602112,      128, 0x23291993
+0,  191471616,  191471616,   602112,      128, 0x23291993
+0,  192073728,  192073728,   602112,      128, 0x23291993
+0,  192675840,  192675840,   602112,      128, 0x23291993
+0,  193277952,  193277952,   602112,      128, 0x23291993
+0,  193880064,  193880064,   602112,      128, 0x23291993
+0,  194482176,  194482176,   602112,      128, 0x23291993
+0,  195084288,  195084288,   602112,      128, 0x23291993
+0,  195686400,  195686400,   602112,      128, 0x23291993
+0,  196288512,  196288512,   602112,      128, 0x23291993
+0,  196890624,  196890624,   602112,      128, 0x23291993
+0,  197492736,  197492736,   602112,      128, 0x23291993
+0,  198094848,  198094848,   602112,      128, 0x23291993
+0,  198696960,  198696960,   602112,      128, 0x23291993
+0,  199299072,  199299072,   602112,      128, 0x23291993
+0,  199901184,  199901184,   602112,      128, 0x23291993
+0,  200503296,  200503296,   602112,      128, 0x23291993
+0,  201105408,  201105408,   602112,      128, 0x23291993
+0,  201707520,  201707520,   602112,      128, 0x23291993
+0,  202309632,  202309632,   602112,      128, 0x23291993
+0,  202911744,  202911744,   602112,      128, 0x23291993
+0,  203513856,  203513856,   602112,      128, 0x23291993
+0,  204115968,  204115968,   602112,      128, 0x23291993
+0,  204718080,  204718080,   602112,      128, 0x23291993
+0,  205320192,  205320192,   602112,      128, 0x23291993
+0,  205922304,  205922304,   602112,      128, 0x23291993
+0,  206524416,  206524416,   602112,      128, 0x23291993
+0,  207126528,  207126528,   602112,      128, 0x23291993
+0,  207728640,  207728640,   602112,      128, 0x23291993
+0,  208330752,  208330752,   602112,      128, 0x23291993
+0,  208932864,  208932864,   602112,      128, 0x23291993
+0,  209534976,  209534976,   602112,      128, 0x23291993
+0,  210137088,  210137088,   602112,      128, 0x23291993
+0,  210739200,  210739200,   602112,      128, 0x23291993
+0,  211341312,  211341312,   602112,      128, 0x23291993
+0,  211943424,  211943424,   602112,      128, 0x23291993
+0,  212545536,  212545536,   602112,      128, 0x23291993
+0,  213147648,  213147648,   602112,      128, 0x23291993
+0,  213749760,  213749760,   602112,      128, 0x23291993
+0,  214351872,  214351872,   602112,      128, 0x23291993
+0,  214953984,  214953984,   602112,      128, 0x23291993
+0,  215556096,  215556096,   602112,      128, 0x23291993
+0,  216158208,  216158208,   602112,      128, 0x23291993
+0,  216760320,  216760320,   602112,      128, 0x23291993
+0,  217362432,  217362432,   602112,      128, 0x23291993
+0,  217964544,  217964544,   602112,      128, 0x23291993
+0,  218566656,  218566656,   602112,      128, 0x23291993
+0,  219168768,  219168768,   602112,      128, 0x23291993
+0,  219770880,  219770880,   602112,      128, 0x23291993
+0,  220372992,  220372992,   602112,      128, 0x23291993
+0,  220975104,  220975104,   602112,      128, 0x23291993
+0,  221577216,  221577216,   602112,      128, 0x23291993
+0,  222179328,  222179328,   602112,      128, 0x23291993
+0,  222781440,  222781440,   602112,      128, 0x23291993
+0,  223383552,  223383552,   602112,      128, 0x23291993
+0,  223985664,  223985664,   602112,      128, 0x23291993
+0,  224587776,  224587776,   602112,      128, 0x23291993
+0,  225189888,  225189888,   602112,      128, 0x23291993
+0,  225792000,  225792000,   602112,      128, 0x23291993
+0,  226394112,  226394112,   602112,      128, 0x23291993
+0,  226996224,  226996224,   602112,      128, 0x23291993
+0,  227598336,  227598336,   602112,      128, 0x23291993
+0,  228200448,  228200448,   602112,      128, 0x23291993
+0,  228802560,  228802560,   602112,      128, 0x23291993
+0,  229404672,  229404672,   602112,      128, 0x23291993
+0,  230006784,  230006784,   602112,      128, 0x23291993
+0,  230608896,  230608896,   602112,      128, 0x23291993
+0,  231211008,  231211008,   602112,      128, 0x23291993
+0,  231813120,  231813120,   602112,      128, 0x23291993
+0,  232415232,  232415232,   602112,      128, 0x23291993
+0,  233017344,  233017344,   602112,      128, 0x23291993
+0,  233619456,  233619456,   602112,      128, 0x23291993
+0,  234221568,  234221568,   602112,      128, 0x23291993
+0,  234823680,  234823680,   602112,      128, 0x23291993
+0,  235425792,  235425792,   602112,      128, 0x23291993
+0,  236027904,  236027904,   602112,      128, 0x23291993
+0,  236630016,  236630016,   602112,      128, 0x23291993
+0,  237232128,  237232128,   602112,      128, 0x23291993
+0,  237834240,  237834240,   602112,      128, 0x23291993
+0,  238436352,  238436352,   602112,      128, 0x23291993
+0,  239038464,  239038464,   602112,      128, 0x23291993
+0,  239640576,  239640576,   602112,      128, 0x23291993
+0,  240242688,  240242688,   602112,      128, 0x23291993
+0,  240844800,  240844800,   602112,      128, 0x23291993
+0,  241446912,  241446912,   602112,      128, 0x23291993
+0,  242049024,  242049024,   602112,      128, 0x23291993
+0,  242651136,  242651136,   602112,      128, 0x23291993
+0,  243253248,  243253248,   602112,      128, 0x23291993
+0,  243855360,  243855360,   602112,      128, 0x23291993
+0,  244457472,  244457472,   602112,      128, 0x23291993
+0,  245059584,  245059584,   602112,      128, 0x23291993
+0,  245661696,  245661696,   602112,      128, 0x23291993
+0,  246263808,  246263808,   602112,      128, 0x23291993
+0,  246865920,  246865920,   602112,      128, 0x23291993
+0,  247468032,  247468032,   602112,      128, 0x23291993
+0,  248070144,  248070144,   602112,      128, 0x23291993
+0,  248672256,  248672256,   602112,      128, 0x23291993
+0,  249274368,  249274368,   602112,      128, 0x23291993
+0,  249876480,  249876480,   602112,      128, 0x23291993
+0,  250478592,  250478592,   602112,      128, 0x23291993
+0,  251080704,  251080704,   602112,      128, 0x23291993
+0,  251682816,  251682816,   602112,      128, 0x23291993
+0,  252284928,  252284928,   602112,      128, 0x23291993
+0,  252887040,  252887040,   602112,      128, 0x23291993
+0,  253489152,  253489152,   602112,      128, 0x23291993
+0,  254091264,  254091264,   602112,      128, 0x23291993
+0,  254693376,  254693376,   602112,      128, 0x23291993
+0,  255295488,  255295488,   602112,      128, 0x23291993
+0,  255897600,  255897600,   602112,      128, 0x23291993
+0,  256499712,  256499712,   602112,      128, 0x23291993
+0,  257101824,  257101824,   602112,      128, 0x23291993
+0,  257703936,  257703936,   602112,      128, 0x23291993
+0,  258306048,  258306048,   602112,      128, 0x23291993
+0,  258908160,  258908160,   602112,      128, 0x23291993
+0,  259510272,  259510272,   602112,      128, 0x23291993
+0,  260112384,  260112384,   602112,      128, 0x23291993
+0,  260714496,  260714496,   602112,      128, 0x23291993
+0,  261316608,  261316608,   602112,      128, 0x23291993
+0,  261918720,  261918720,   602112,      128, 0x23291993
+0,  262520832,  262520832,   602112,      128, 0x23291993
+0,  263122944,  263122944,   602112,      128, 0x23291993
+0,  263725056,  263725056,   602112,      128, 0x23291993
+0,  264327168,  264327168,   602112,      128, 0x23291993
+0,  264929280,  264929280,   602112,      128, 0x23291993
+0,  265531392,  265531392,   602112,      128, 0x23291993
+0,  266133504,  266133504,   602112,      128, 0x23291993
+0,  266735616,  266735616,   602112,      128, 0x23291993
+0,  267337728,  267337728,   602112,      128, 0x23291993
+0,  267939840,  267939840,   602112,      128, 0x23291993
+0,  268541952,  268541952,   602112,      128, 0x23291993
+0,  269144064,  269144064,   602112,      128, 0x23291993
+0,  269746176,  269746176,   602112,      128, 0x23291993
+0,  270348288,  270348288,   602112,      128, 0x23291993
+0,  270950400,  270950400,   602112,      128, 0x23291993
+0,  271552512,  271552512,   602112,      128, 0x23291993
+0,  272154624,  272154624,   602112,      128, 0x23291993
+0,  272756736,  272756736,   602112,      128, 0x23291993
+0,  273358848,  273358848,   602112,      128, 0x23291993
+0,  273960960,  273960960,   602112,      128, 0x23291993
+0,  274563072,  274563072,   602112,      128, 0x23291993
+0,  275165184,  275165184,   602112,      128, 0x23291993
+0,  275767296,  275767296,   602112,      128, 0x23291993
+0,  276369408,  276369408,   602112,      128, 0x23291993
+0,  276971520,  276971520,   602112,      128, 0x23291993
+0,  277573632,  277573632,   602112,      128, 0x23291993
+0,  278175744,  278175744,   602112,      128, 0x23291993
+0,  278777856,  278777856,   602112,      128, 0x23291993
+0,  279379968,  279379968,   602112,      128, 0x23291993
+0,  279982080,  279982080,   602112,      128, 0x23291993
+0,  280584192,  280584192,   602112,      128, 0x23291993
+0,  281186304,  281186304,   602112,      128, 0x23291993
+0,  281788416,  281788416,   602112,      128, 0x23291993