Adding support for parsing BlockAdditional
authorVignesh Venkatasubramanian <vigneshv@google.com>
Wed, 13 Feb 2013 21:51:48 +0000 (13:51 -0800)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 13 Feb 2013 23:46:28 +0000 (00:46 +0100)
Matroska specification lists support for BlockAdditional element
which is not supported by ffmpeg's matroska parser. This patch
adds grammar definitions for parsing that element (and few other
related elements) and then puts the data in AVPacket.side_data
with new AVPacketSideDataType AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL.

Signed-off-by: Vignesh Venkatasubramanian <vigneshv@google.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/avcodec.h
libavformat/matroska.h
libavformat/matroskadec.c
tests/fate/vpx.mak
tests/ref/fate/vp8-alpha [new file with mode: 0644]

index ca7764a..68eac55 100644 (file)
@@ -983,6 +983,14 @@ enum AVPacketSideDataType {
      * @endcode
      */
     AV_PKT_DATA_SUBTITLE_POSITION,
+
+    /**
+     * Data found in BlockAdditional element of matroska container. There is
+     * no end marker for the data, so it is required to rely on the side data
+     * size to recognize the end. 8 byte id (as found in BlockAddId) followed
+     * by data.
+     */
+    AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
 };
 
 /**
index 8411633..769fe54 100644 (file)
 #define MATROSKA_ID_CLUSTERPOSITION 0xA7
 #define MATROSKA_ID_CLUSTERPREVSIZE 0xAB
 #define MATROSKA_ID_BLOCKGROUP 0xA0
+#define MATROSKA_ID_BLOCKADDITIONS 0x75A1
+#define MATROSKA_ID_BLOCKMORE 0xA6
+#define MATROSKA_ID_BLOCKADDID 0xEE
+#define MATROSKA_ID_BLOCKADDITIONAL 0xA5
 #define MATROSKA_ID_SIMPLEBLOCK 0xA3
 
 /* IDs in the blockgroup master */
index 294e38c..94079ab 100644 (file)
@@ -32,6 +32,7 @@
 #include "avformat.h"
 #include "internal.h"
 #include "avio_internal.h"
+#include "network.h"
 /* For ff_codec_get_id(). */
 #include "riff.h"
 #include "isom.h"
@@ -163,6 +164,7 @@ typedef struct {
     AVStream *stream;
     int64_t end_timecode;
     int ms_compat;
+    uint64_t max_block_additional_id;
 } MatroskaTrack;
 
 typedef struct {
@@ -279,6 +281,8 @@ typedef struct {
     int64_t  reference;
     uint64_t non_simple;
     EbmlBin  bin;
+    uint64_t additional_id;
+    EbmlBin  additional;
 } MatroskaBlock;
 
 static EbmlSyntax ebml_header[] = {
@@ -385,6 +389,7 @@ static EbmlSyntax matroska_track[] = {
     { MATROSKA_ID_TRACKAUDIO,           EBML_NEST, 0, offsetof(MatroskaTrack,audio), {.n=matroska_track_audio} },
     { MATROSKA_ID_TRACKOPERATION,       EBML_NEST, 0, offsetof(MatroskaTrack,operation), {.n=matroska_track_operation} },
     { MATROSKA_ID_TRACKCONTENTENCODINGS,EBML_NEST, 0, 0, {.n=matroska_track_encodings} },
+    { MATROSKA_ID_TRACKMAXBLKADDID,     EBML_UINT, 0, offsetof(MatroskaTrack,max_block_additional_id) },
     { MATROSKA_ID_TRACKFLAGENABLED,     EBML_NONE },
     { MATROSKA_ID_TRACKFLAGLACING,      EBML_NONE },
     { MATROSKA_ID_CODECNAME,            EBML_NONE },
@@ -393,7 +398,6 @@ static EbmlSyntax matroska_track[] = {
     { MATROSKA_ID_CODECDOWNLOADURL,     EBML_NONE },
     { MATROSKA_ID_TRACKMINCACHE,        EBML_NONE },
     { MATROSKA_ID_TRACKMAXCACHE,        EBML_NONE },
-    { MATROSKA_ID_TRACKMAXBLKADDID,     EBML_NONE },
     { 0 }
 };
 
@@ -524,8 +528,20 @@ static EbmlSyntax matroska_segments[] = {
     { 0 }
 };
 
+static EbmlSyntax matroska_blockmore[] = {
+    { MATROSKA_ID_BLOCKADDID,      EBML_UINT, 0, offsetof(MatroskaBlock,additional_id) },
+    { MATROSKA_ID_BLOCKADDITIONAL, EBML_BIN,  0, offsetof(MatroskaBlock,additional) },
+    { 0 }
+};
+
+static EbmlSyntax matroska_blockadditions[] = {
+    { MATROSKA_ID_BLOCKMORE, EBML_NEST, 0, 0, {.n=matroska_blockmore} },
+    { 0 }
+};
+
 static EbmlSyntax matroska_blockgroup[] = {
     { MATROSKA_ID_BLOCK,          EBML_BIN,  0, offsetof(MatroskaBlock,bin) },
+    { MATROSKA_ID_BLOCKADDITIONS, EBML_NEST, 0, 0, {.n=matroska_blockadditions} },
     { MATROSKA_ID_SIMPLEBLOCK,    EBML_BIN,  0, offsetof(MatroskaBlock,bin) },
     { MATROSKA_ID_BLOCKDURATION,  EBML_UINT, 0, offsetof(MatroskaBlock,duration) },
     { MATROSKA_ID_BLOCKREFERENCE, EBML_UINT, 0, offsetof(MatroskaBlock,reference) },
@@ -2074,7 +2090,8 @@ static int matroska_parse_frame(MatroskaDemuxContext *matroska,
                                 AVStream *st,
                                 uint8_t *data, int pkt_size,
                                 uint64_t timecode, uint64_t lace_duration,
-                                int64_t pos, int is_keyframe)
+                                int64_t pos, int is_keyframe,
+                                uint8_t *additional, uint64_t additional_id, int additional_size)
 {
     MatroskaTrackEncoding *encodings = track->encodings.elem;
     uint8_t *pkt_data = data;
@@ -2111,6 +2128,19 @@ static int matroska_parse_frame(MatroskaDemuxContext *matroska,
     pkt->flags = is_keyframe;
     pkt->stream_index = st->index;
 
+    if (additional_size > 0) {
+        uint8_t *side_data = av_packet_new_side_data(pkt,
+                                                     AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
+                                                     additional_size + sizeof(additional_id));
+        uint8_t additional_id_buf[8];
+        if(side_data == NULL) {
+            return AVERROR(ENOMEM);
+        }
+        AV_WB64(additional_id_buf, additional_id);
+        memcpy(side_data, additional_id_buf, 8);
+        memcpy(side_data + 8, additional, additional_size);
+    }
+
     if (track->ms_compat)
         pkt->dts = timecode;
     else
@@ -2160,6 +2190,7 @@ static int matroska_parse_frame(MatroskaDemuxContext *matroska,
 static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
                                 int size, int64_t pos, uint64_t cluster_time,
                                 uint64_t block_duration, int is_keyframe,
+                                uint8_t *additional, uint64_t additional_id, int additional_size,
                                 int64_t cluster_pos)
 {
     uint64_t timecode = AV_NOPTS_VALUE;
@@ -2253,7 +2284,8 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
         } else {
             res = matroska_parse_frame(matroska, track, st, data, lace_size[n],
                                       timecode, lace_duration,
-                                      pos, !n? is_keyframe : 0);
+                                      pos, !n? is_keyframe : 0,
+                                      additional, additional_id, additional_size);
             if (res)
                 goto end;
         }
@@ -2309,6 +2341,8 @@ static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
         i = blocks_list->nb_elem - 1;
         if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
             int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1;
+            uint8_t* additional = blocks[i].additional.size > 0 ?
+                                    blocks[i].additional.data : NULL;
             if (!blocks[i].non_simple)
                 blocks[i].duration = 0;
             res = matroska_parse_block(matroska,
@@ -2316,6 +2350,8 @@ static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
                                        blocks[i].bin.pos,
                                        matroska->current_cluster.timecode,
                                        blocks[i].duration, is_keyframe,
+                                       additional, blocks[i].additional_id,
+                                       blocks[i].additional.size,
                                        matroska->current_cluster_pos);
         }
     }
@@ -2346,7 +2382,7 @@ static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
             res=matroska_parse_block(matroska,
                                      blocks[i].bin.data, blocks[i].bin.size,
                                      blocks[i].bin.pos,  cluster.timecode,
-                                     blocks[i].duration, is_keyframe,
+                                     blocks[i].duration, is_keyframe, NULL, 0, 0,
                                      pos);
         }
     ebml_free(matroska_cluster, &cluster);
index a51ef07..061a1e8 100644 (file)
@@ -22,6 +22,9 @@ fate-vp6a: CMD = framecrc -i $(SAMPLES)/flash-vp6/300x180-Scr-f8-056alpha.flv
 FATE_VP6-$(call DEMDEC, FLV, VP6F) += fate-vp6f
 fate-vp6f: CMD = framecrc -i $(SAMPLES)/flash-vp6/clip1024.flv
 
+FATE_VP8-$(call DEMDEC, FLV, VP8) += fate-vp8-alpha
+fate-vp8-alpha: CMD = framecrc -i $(SAMPLES)/vp8_alpha/vp8_video_with_alpha.webm -vcodec copy
+
 FATE_SAMPLES_AVCONV += $(FATE_VP6-yes)
 fate-vp6: $(FATE_VP6-yes)
 
diff --git a/tests/ref/fate/vp8-alpha b/tests/ref/fate/vp8-alpha
new file mode 100644 (file)
index 0000000..f857a87
--- /dev/null
@@ -0,0 +1,121 @@
+#tb 0: 1/1000
+0,          1,          1,        0,     2108, 0x59b92a34, S=1,     1900, 0x8fb3adc5
+0,         33,         33,        0,      142, 0x2f2a3fed, F=0x0, S=1,      160, 0xa13346af
+0,         66,         66,        0,      157, 0x17804767, F=0x0, S=1,      209, 0x64115f15
+0,        100,        100,        0,      206, 0x537262ca, F=0x0, S=1,      317, 0x44a09dd0
+0,        133,        133,        0,      259, 0x73ff74b6, F=0x0, S=1,      384, 0x2ee2c588
+0,        166,        166,        0,      320, 0x0fcf8ce4, F=0x0, S=1,      415, 0xff68c953
+0,        200,        200,        0,      377, 0x8fffb5f5, F=0x0, S=1,      475, 0x4166f3eb
+0,        233,        233,        0,      407, 0xe476c19e, F=0x0, S=1,      193, 0x3ff75489
+0,        266,        266,        0,      539, 0x90202334, F=0x0, S=1,      681, 0x776656b0
+0,        300,        300,        0,      560, 0xc6e2168d, F=0x0, S=1,      585, 0xddc81b8a
+0,        333,        333,        0,      597, 0x201a32a7, F=0x0, S=1,      574, 0x8baa1d65
+0,        366,        366,        0,      770, 0xab2b8891, F=0x0, S=1,      666, 0xcd8e51eb
+0,        400,        400,        0,      708, 0xc2386711, F=0x0, S=1,      706, 0x046b6444
+0,        433,        433,        0,      905, 0x7211c52d, F=0x0, S=1,      814, 0x5e288def
+0,        466,        466,        0,      770, 0xda4f8574, F=0x0, S=1,      829, 0xa0e8a949
+0,        500,        500,        0,      955, 0xf9a1d77a, F=0x0, S=1,      857, 0x9b63b955
+0,        533,        533,        0,      970, 0xff4de39a, F=0x0, S=1,      153, 0x3b00416c
+0,        566,        566,        0,      978, 0x12bcf81f, F=0x0, S=1,     1181, 0xce175555
+0,        600,        600,        0,     1233, 0x2903744a, F=0x0, S=1,      860, 0x737eb566
+0,        633,        633,        0,     1118, 0x7f274f50, F=0x0, S=1,      933, 0xb669c6b6
+0,        666,        666,        0,      941, 0x6bffd4b1, F=0x0, S=1,     1058, 0x07581cee
+0,        700,        700,        0,     1598, 0xc007219f, F=0x0, S=1,      939, 0x2c0bdc45
+0,        733,        733,        0,     1218, 0x25d962b6, F=0x0, S=1,     1090, 0x96482341
+0,        766,        766,        0,     1200, 0x86b85be3, F=0x0, S=1,      189, 0x3f085309
+0,        800,        800,        0,     1329, 0x298a848a, F=0x0, S=1,     1426, 0x6ea3df12
+0,        833,        833,        0,     1500, 0xe437edec, F=0x0, S=1,     1244, 0x32836b8d
+0,        866,        866,        0,     1288, 0xc4447dd5, F=0x0, S=1,     1289, 0x06a57b0f
+0,        900,        900,        0,     1281, 0xb5bf7e9f, F=0x0, S=1,     1227, 0xd96d5697
+0,        933,        933,        0,     1372, 0x09be9014, F=0x0, S=1,     1556, 0x2630fbff
+0,        966,        966,        0,     1238, 0x42ce6316, F=0x0, S=1,     1287, 0x1d3084f6
+0,       1000,       1000,        0,     1655, 0xb94b45c2, F=0x0, S=1,     1494, 0x34dbd1a4
+0,       1033,       1033,        0,     1164, 0xf6b93ad0, F=0x0, S=1,     1337, 0xba6d9673
+0,       1066,       1066,        0,     1084, 0x58c50fb5, F=0x0, S=1,     1384, 0x3fabb82b
+0,       1100,       1100,        0,     1151, 0x0b3f3359, F=0x0, S=1,     1353, 0x08e2a1d7
+0,       1133,       1133,        0,     1277, 0xa3ae77e1, F=0x0, S=1,     1409, 0xf65cb9f7
+0,       1166,       1166,        0,      782, 0xdcf671ff, F=0x0, S=1,     1408, 0x01e2ac53
+0,       1200,       1200,        0,      926, 0xe913c286, F=0x0, S=1,     1320, 0x32e38e42
+0,       1233,       1233,        0,      970, 0x3d86e5ae, F=0x0, S=1,     1608, 0x40b52618
+0,       1266,       1266,        0,     1353, 0xe4f197b2, F=0x0, S=1,     1272, 0xf1d272a5
+0,       1300,       1300,        0,      685, 0x629b4ce4, F=0x0, S=1,     1257, 0x14845de9
+0,       1333,       1333,        0,      743, 0x6f1172a3, F=0x0, S=1,     1260, 0xa6c66fda
+0,       1366,       1366,        0,      789, 0x94fc84cd, F=0x0, S=1,     1009, 0x7daaf2b0
+0,       1400,       1400,        0,     1460, 0x668adb82, F=0x0, S=1,      944, 0x44b6ccf5
+0,       1433,       1433,        0,      766, 0x49c884ef, F=0x0, S=1,      996, 0x8646e6dd
+0,       1466,       1466,        0,     1037, 0x24831498, F=0x0, S=1,      983, 0x14a9e7a6
+0,       1500,       1500,        0,      943, 0x1f53d180, F=0x0, S=1,     1107, 0x02f72acb
+0,       1533,       1533,        0,     1152, 0xbf6a35ae, F=0x0, S=1,     1026, 0xd57afda0
+0,       1566,       1566,        0,      730, 0x42806abf, F=0x0, S=1,     1029, 0xfb0402d5
+0,       1600,       1600,        0,      975, 0xa5ffec57, F=0x0, S=1,     1081, 0xe2890cea
+0,       1633,       1633,        0,      970, 0xbe8ee224, F=0x0, S=1,     1151, 0x7b0d3b20
+0,       1666,       1666,        0,     1012, 0x20c6f0d8, F=0x0, S=1,      979, 0xc25cd69c
+0,       1700,       1700,        0,      874, 0x1a2fb4da, F=0x0, S=1,      943, 0xdb2dc9f8
+0,       1733,       1733,        0,      869, 0xab0caf3d, F=0x0, S=1,      934, 0x48b9bfcc
+0,       1766,       1766,        0,      863, 0xd8caa2e5, F=0x0, S=1,      874, 0x0b34b026
+0,       1800,       1800,        0,     1246, 0x47866cdc, F=0x0, S=1,      818, 0x0c908eeb
+0,       1833,       1833,        0,      742, 0xa6296ac1, F=0x0, S=1,      921, 0x97b6b053
+0,       1866,       1866,        0,      828, 0x0b568d7a, F=0x0, S=1,      969, 0x3314dbfa
+0,       1900,       1900,        0,      825, 0x6d329394, F=0x0, S=1,      982, 0x5f66e68c
+0,       1933,       1933,        0,      836, 0x8ace8dfb, F=0x0, S=1,      929, 0x9ffdc2fd
+0,       1966,       1966,        0,     1774, 0xd4686726, F=0x0, S=1,      909, 0x11a9c07a
+0,       2000,       2000,        0,     1803, 0x08c879ce, F=0x0, S=1,     1525, 0x1e11f02f
+0,       2033,       2033,        0,      518, 0x7c32fc72, F=0x0, S=1,      785, 0xfc1f792a
+0,       2066,       2066,        0,      790, 0x3dac8aa0, F=0x0, S=1,      876, 0x0918c88d
+0,       2100,       2100,        0,      927, 0x4feccb24, F=0x0, S=1,     1059, 0xbcaa05c7
+0,       2133,       2133,        0,      835, 0x29d39266, F=0x0, S=1,      980, 0x4913e409
+0,       2166,       2166,        0,      951, 0xc1dddd12, F=0x0, S=1,     1041, 0x0541047e
+0,       2200,       2200,        0,      876, 0x2f6eb89d, F=0x0, S=1,      949, 0x2d56c53b
+0,       2233,       2233,        0,      959, 0xf0dedabd, F=0x0, S=1,     1022, 0x8d33f5fa
+0,       2266,       2266,        0,      860, 0x9274ab39, F=0x0, S=1,     1061, 0x289c0132
+0,       2300,       2300,        0,      863, 0x7058ba30, F=0x0, S=1,      940, 0x1f32d4a3
+0,       2333,       2333,        0,     1021, 0xcabdf84f, F=0x0, S=1,      887, 0xda8ab95e
+0,       2366,       2366,        0,      897, 0x9867c8e8, F=0x0, S=1,      840, 0xd93eaaf5
+0,       2400,       2400,        0,      897, 0x6a16b5db, F=0x0, S=1,      977, 0x7b77dc9b
+0,       2433,       2433,        0,      953, 0xe9b4cf1f, F=0x0, S=1,      921, 0x75a8ca45
+0,       2466,       2466,        0,      847, 0x0335ad37, F=0x0, S=1,     1000, 0x2691f3bd
+0,       2500,       2500,        0,      902, 0x3360b315, F=0x0, S=1,     1008, 0xd5e1deb6
+0,       2533,       2533,        0,      881, 0xf5309d59, F=0x0, S=1,     1113, 0xdbef3065
+0,       2566,       2566,        0,      974, 0x7c2de3ce, F=0x0, S=1,     1086, 0x365626bb
+0,       2600,       2600,        0,      974, 0xf42bd9f5, F=0x0, S=1,     1039, 0xa7e9060d
+0,       2633,       2633,        0,     1029, 0x7c33f4d0, F=0x0, S=1,     1041, 0xf4affa59
+0,       2666,       2666,        0,      881, 0x9021a565, F=0x0, S=1,     1039, 0xc1e00521
+0,       2700,       2700,        0,     1157, 0xe1c136f7, F=0x0, S=1,      917, 0x357ac7d3
+0,       2733,       2733,        0,      649, 0xdffb3cb7, F=0x0, S=1,      976, 0xa386e05e
+0,       2766,       2766,        0,      758, 0xb67875f3, F=0x0, S=1,     1041, 0xae4e0a63
+0,       2800,       2800,        0,     1105, 0x8ffb1a26, F=0x0, S=1,      962, 0x211ddc5e
+0,       2833,       2833,        0,      866, 0xa60eb2d9, F=0x0, S=1,      929, 0xe9e4c84b
+0,       2866,       2866,        0,      912, 0xcd34bf9b, F=0x0, S=1,      946, 0xfce9d359
+0,       2900,       2900,        0,      868, 0x5651a343, F=0x0, S=1,      809, 0x624a8ef9
+0,       2933,       2933,        0,      997, 0xfa66eaeb, F=0x0, S=1,      992, 0xc913e5e2
+0,       2966,       2966,        0,     1111, 0x3f272497, F=0x0, S=1,     1007, 0xf78ee6a7
+0,       3000,       3000,        0,      842, 0xe442999f, F=0x0, S=1,      972, 0x25a0d25c
+0,       3033,       3033,        0,     1030, 0x6f97ffad, F=0x0, S=1,      993, 0x4059fd6b
+0,       3066,       3066,        0,     1176, 0x66e64926, F=0x0, S=1,      951, 0x2762cdf1
+0,       3100,       3100,        0,      803, 0xfd1699cb, F=0x0, S=1,      959, 0x5cf9d56c
+0,       3133,       3133,        0,      972, 0x1cdff00e, F=0x0, S=1,     1023, 0xeaf20900
+0,       3166,       3166,        0,      907, 0x17f8acca, F=0x0, S=1,     1054, 0xeb010c4d
+0,       3200,       3200,        0,      915, 0x3569b545, F=0x0, S=1,      987, 0x73b2e159
+0,       3233,       3233,        0,     1021, 0x14c5076a, F=0x0, S=1,     1007, 0x6c4bf7f0
+0,       3266,       3266,        0,      837, 0xbf86b0ef, F=0x0, S=1,      963, 0xf472d31a
+0,       3300,       3300,        0,      885, 0x1caac123, F=0x0, S=1,     1052, 0x2b7bfd20
+0,       3333,       3333,        0,     1355, 0x299e8d3c, F=0x0, S=1,      858, 0x2bbca3f0
+0,       3366,       3366,        0,      784, 0xb0bd7e9d, F=0x0, S=1,      969, 0xc865dc00
+0,       3400,       3400,        0,      991, 0xbc7ddda9, F=0x0, S=1,     1028, 0x801b00a6
+0,       3433,       3433,        0,      986, 0xb356f6b1, F=0x0, S=1,     1056, 0x8b840add
+0,       3466,       3466,        0,      978, 0x94a3e87e, F=0x0, S=1,     1018, 0xe766fa52
+0,       3500,       3500,        0,      976, 0x55ddd14a, F=0x0, S=1,      992, 0x58a9ddfe
+0,       3533,       3533,        0,     1241, 0x1ec867f7, F=0x0, S=1,      966, 0xa329e84f
+0,       3566,       3566,        0,      975, 0xecf5dbb3, F=0x0, S=1,      899, 0xa7539f4d
+0,       3600,       3600,        0,     1129, 0xb7243037, F=0x0, S=1,     1057, 0xbd0d10bd
+0,       3633,       3633,        0,      913, 0xe5f1d03d, F=0x0, S=1,     1092, 0xeb9621f8
+0,       3666,       3666,        0,      943, 0x87d0ed78, F=0x0, S=1,     1057, 0x079c1054
+0,       3700,       3700,        0,      917, 0x536cc3fd, F=0x0, S=1,      946, 0xd2b9d0e2
+0,       3733,       3733,        0,      892, 0x4dffb1e2, F=0x0, S=1,      930, 0x70c9cc40
+0,       3766,       3766,        0,      957, 0x1a98e71c, F=0x0, S=1,      719, 0x6fec614a
+0,       3800,       3800,        0,      893, 0xf405b2c3, F=0x0, S=1,      821, 0x63529cab
+0,       3833,       3833,        0,      978, 0xa0a8d5f6, F=0x0, S=1,      745, 0x3c616219
+0,       3866,       3866,        0,      887, 0xfa7cb65d, F=0x0, S=1,      768, 0xb8f07885
+0,       3900,       3900,        0,      867, 0xd808ade7, F=0x0, S=1,      783, 0xf82b6b9a
+0,       3933,       3933,        0,     1068, 0x6f8b135a, F=0x0, S=1,      807, 0x52028d50
+0,       3966,       3966,        0,     2010, 0x536fe0b6, F=0x0, S=1,     1512, 0x690aeb55