โ† All Tools
Tesla Dashcam SEI Decoder ยท The Vehicle Network App
๐Ÿ”ฌ Decode your own file โ†’
Learning Tool
Example data only โ€” not a general-purpose decoder
โฌกHex Map
โ‰กFields
โŠžSEI Explorer
โ—ŽLearn

Tesla Dashcam SEI Decoder

This tool walks you through exactly how telemetry data is hidden inside a Tesla dashcam video file โ€” and how a forensic examiner reads it. It uses one verified reference MP4 file with confirmed, independently decoded values.

Every byte shown here is from a real Tesla dashcam clip. Every value has been verified against Tesla's own SEI Explorer tool. This is not a simulation โ€” it is a learning tool built on real forensic data.

Decoded and built by Noel Lowdon, Harper Shaw Investigation Consultants Ltd in collaboration with Claude (Anthropic) โ€” an AI assistant used to perform, verify, and explain the decode process and build this interactive tool.

1
Click "Load Event Data" in the sidebar to display the raw hex bytes from the file's first frame.
2
Click any coloured byte in the Hex Map. A step-by-step decoder walks you through the arithmetic in plain English.
3
Use the Fields tab to see all decoded values at a glance, each verified against the manufacturer's own extraction tool.
4
Visit the Learn tab for explanations of every concept โ€” what hex is, how the MP4 container works, what IEEE 754 means, how protobuf encodes data.
If you have come here directly, there is a prequel to this tool โ€” a blog post covering the background and context before you explore the decoded data.  Read it here โ†’
This tool uses a single reference file. If you have a Tesla dashcam MP4 from a real case and need to decode it directly, use the TVN Labs forensic decoder.  Tesla SEI Forensic Decoder โ†’
A note before you start

This tool has been made freely available to support learning and professional development within the vehicle forensics community. It is built on a single verified reference file and is intended to illustrate how Tesla dashcam SEI telemetry is structured and decoded โ€” not to serve as a substitute for validated casework tools or peer-reviewed methodology.

Every effort has been made to ensure the content is accurate. All decoded values have been independently verified against the Tesla SEI Explorer. However, vehicle systems and file formats can vary, and this tool should be treated as educational material rather than definitive technical guidance.

If you spot an inaccuracy, have a correction, or want to contribute to improving the content, please contact training@harpershaw.co.uk โ€” feedback from the community is genuinely welcomed and helps keep this resource accurate for everyone.
Decoding
Load event data from the sidebar first to see the decoded field summary.

Road to USB

This section gives a broad overview of the recording chain. Each step will be covered in greater depth as this resource develops. Where things are not fully confirmed or tested that is stated clearly.

1
The camera captures the scene

The dashcam lens focuses light onto an image sensor which converts it to electrical signals. The processor turns those signals into a video frame. This happens repeatedly while the vehicle is moving and recording is active.

How many frames are captured per second and whether the interval between frames is consistent has not been independently tested. The reference file gives an average of approximately 36 frames per second across 60 seconds but individual frame intervals may vary and should not be assumed to be evenly spaced.
2
The video is compressed into H.264

Raw video data is far too large to store directly. The processor compresses it using the H.264 standard โ€” a published international video compression format. The compressed output is structured into NAL units โ€” discrete chunks of data each with a one byte header identifying what type of data it contains. The compression is lossy, meaning some fine visual detail is discarded, but the vehicle telemetry embedded alongside it is not compressed in the same way.

3
Vehicle telemetry is collected

At some point during or around each frame capture the dashcam system reads vehicle data from the vehicle's systems โ€” speed, steering angle, GPS coordinates, gear state, brake status, indicator status, and autopilot state among others.

Exactly when this data is sampled relative to each frame and whether there is any lag between the frame being captured and the telemetry being recorded is not confirmed. This requires further testing and should not be assumed. In a dynamic situation such as heavy braking or a sudden event the relationship may differ from normal driving conditions.
4
The telemetry is embedded into the video stream as an SEI unit

The vehicle data is encoded using Protocol Buffers โ€” a compact binary format published by Google โ€” and wrapped in an SEI unit. SEI stands for Supplemental Enhancement Information and is a reserved H.264 unit type intended for vendor defined custom data. A UUID identifier is included at the start of each SEI unit so tools that know what to look for can find and decode it. In the reference file there is one SEI unit for each of the 2,174 frames โ€” these are the bytes you see in the Hex Map tab.

The exact timing relationship between each SEI unit and its corresponding frame has not been independently verified. The one to one count is confirmed. The precise synchronisation is not.
5
Everything is packaged into an MP4 file

The NAL units are written into the mdat block of an MP4 container frame by frame as recording continues. The file grows continuously. The moov index โ€” the file's table of contents containing timestamps and frame locations โ€” is only written when recording stops cleanly. Until then the file exists as raw data without a navigable index.

6
What may happen if power is lost suddenly

If power to the dashcam is cut abruptly the moov index may never be written. Without it a standard video player cannot read the file and reports it as unreadable or corrupt. Whether the frame data and telemetry recorded up to that point is recoverable depends entirely on the physical condition of the drive and the specific circumstances of the power loss.

This has not been tested across a range of real collision recovered devices. The outcome cannot be predicted without physical examination of the specific drive. An unplayable file is worth specialist examination rather than being treated as unrecoverable โ€” but recovery cannot be assumed.
7
The data sits on the USB drive in flash memory

The data is stored in flash memory โ€” a type of storage with no moving parts that retains data without power. Flash is not vulnerable to physical shock in the same way a spinning hard drive is. However physical damage to the drive from a collision may still prevent access even if the underlying data is intact. A physically damaged drive is worth specialist examination. Flash memory storage will be covered in more depth as this resource develops.

Where this leads

Now you know how the data gets onto the drive the following sections explain what it looks like once it is there. What is hex? explains the notation used to read binary data. MP4 container shows the file structure. NAL and SEI explains how the telemetry is embedded. IEEE 754 shows how bytes become decimal numbers. The Hex Map tab shows you those bytes from the actual reference file.

Binary

The foundation everything else in this tool is built on. Understanding binary makes hex, IEEE 754, and protobuf readable rather than mysterious.

Why computers only use 0 and 1
Every piece of information inside a computer โ€” a number, a letter, a photograph, a video file โ€” is stored using electricity. And electricity in a wire has one fundamental property that makes it useful for storing information: it is either flowing or it is not. On or off. There is no in between.
Engineers could not build a system that reliably stored ten different voltage levels โ€” the difference between them would be too small and interference would corrupt the data. But two states โ€” current flowing or not flowing โ€” are reliable, simple, and impossible to confuse.
So the people who designed computers made a decision: one state means 1, the other state means 0. That is the entire foundation of everything a computer does. Every transistor, every memory cell, every byte in every file on every drive โ€” on or off. 1 or 0.
This is not a design choice โ€” it is physics

A transistor is a tiny switch. It is either conducting electricity or it is not. Modern processors contain billions of them. Each one holds a single 1 or 0. Stack eight of them together and you have a byte โ€” a number from 0 to 255. That is the entire system.

How you store a number using only 1s and 0s
If you only have two symbols you cannot write the number 5 directly. You need a system. The system is called binary โ€” and it works exactly like ordinary decimal counting, except instead of ten symbols it uses two, and instead of each column being worth ten times the one to its right, each column is worth double the one to its right.
Think of it like light switches on a wall

Imagine a row of four light switches. Each switch is either on (1) or off (0). But instead of each switch controlling a single light, each switch is worth a value โ€” and the values double from right to left. The rightmost switch is worth 1. The next is worth 2. The next 4. The leftmost 8. To store a number you flip whichever switches add up to it and leave the rest off.

The four switches โ€” try reading these examples
Why does binary read right to left?
For exactly the same reason decimal does. In the number 325, the 5 is on the right and worth the least โ€” just 5. The 3 is on the left and worth the most โ€” 300. The least significant digit is always on the right, the most significant on the left. Binary follows the same convention.
So in binary, the rightmost digit (switch) is always worth 1 โ€” the smallest possible contribution. The leftmost digit is worth the most. When you see 1000 in binary, read it right to left: the 0s in positions 1, 2 and 4 are off, the 1 in position 8 is on. Result: 8.
Decimal versus binary โ€” 0 to 8
The table below shows decimal numbers alongside their binary equivalent. Each column represents one switch. A โœ“ means that switch is on โ€” it contributes its value. A ยท means that switch is off โ€” it contributes nothing.
Decimal 8 4 2 1 Binary How you get there
The column headers are the value of each switch position โ€” 8, 4, 2, 1. Every time you move one column to the left the value doubles. That is base 2.
A full byte โ€” eight switches, 0 to 255
In a computer, switches come in groups of eight. Eight switches is called a byte. The eight switch values are 128, 64, 32, 16, 8, 4, 2, 1 โ€” doubling from right to left. The maximum value with all eight switches on is 128+64+32+16+8+4+2+1 = 255. The minimum with all off is 0. A byte always holds a value between 0 and 255.
Example โ€” the byte 10000010 = decimal 130
Switch 128 is on (contributes 128) ยท Switch 2 is on (contributes 2) ยท All others are off (contribute nothing) ยท Total: 128 + 2 = 130
This particular byte โ€” 10000010 โ€” appears in the vehicle speed decode. It is the exponent byte. And 130 in decimal, once the IEEE 754 bias is applied, gives you the scale of the speed value. Every byte in the hex map is built exactly this way.
Where this leads

Every byte you see in the Hex Map tab is eight of these switches. The colour-coded bytes for vehicle speed, GPS coordinates, steering angle โ€” all of them are groups of bytes, each byte a pattern of 1s and 0s encoding a value. The next section โ€” IEEE 754 โ€” shows exactly how four of those bytes combine to store a decimal number like 12.511 m/s. Now that you know what the bytes are made of, the decode makes sense from the ground up.

What is hexadecimal?

The Binary section explains that computers store everything as patterns of 1s and 0s โ€” eight per byte. The problem is that long strings of binary are almost impossible for humans to read and work with. Hexadecimal โ€” hex for short โ€” is the solution. It is a compact, human readable notation for binary that forensic tools use to display the contents of any file.

Hex uses sixteen symbols โ€” the digits 0 to 9 and the letters A to F. Each hex character represents exactly four binary digits. Two hex characters represent exactly eight binary digits โ€” one complete byte. So every byte in a file is always exactly two hex characters. No more, no fewer.

Think of it like this

Binary is like reading every letter of every word spelled out individually โ€” every sentence would take a page. Hex is like reading the words themselves. The information is identical but one is practical and one is not. When a hex editor shows you 82 2D 48 41 you are looking at exactly four bytes. If it showed you the binary equivalent โ€” 10000010 00101101 01001000 01000001 โ€” you would count mistakes. Hex is not a different thing from binary. It is binary written in a form humans can actually work with.

In a hex editor like 010 Editor, every byte in every file is visible as two hex characters. A video file, a Word document, a dashcam clip โ€” all of them are ultimately a sequence of bytes. A hex editor shows you those bytes directly without any software interpretation. What you see is what is physically stored.

Converting hex to decimal โ€” the two column rule

A hex byte has two characters. The left character sits in the sixteens column โ€” multiply it by 16. The right character sits in the ones column โ€” just add it as is. That is all there is to it.

82 โ†’ left digit 8, right digit 2 โ†’ (8 ร— 16) + 2 โ†’ 128 + 2 โ†’ 130

FF โ†’ left digit F (= 15), right digit F (= 15) โ†’ (15 ร— 16) + 15 โ†’ 240 + 15 โ†’ 255

41 โ†’ left digit 4, right digit 1 โ†’ (4 ร— 16) + 1 โ†’ 64 + 1 โ†’ 65 (the letter A in ASCII)

It works exactly like decimal โ€” in the number 82 the 8 means 8 ร— 10 = 80 and the 2 is just 2. Hex works identically but the left column is worth 16 instead of 10. That is the only difference.

Common conversions to know

00 = 0  ยท  0A = 10  ยท  0C = 12  ยท  10 = 16  ยท  41 = 65  ยท  59 = 89  ยท  82 = 130  ยท  FF = 255

Try it โ€” hex to binary to decimal
Enter any hex byte and see exactly which bit values are active
Hex byte
โ†’
Bit values & binary
โ†’
Decimal total
From bits to terabytes โ€” the full scale

Every unit of digital storage is built from the same foundation โ€” the bit. The hierarchy below shows how units stack up, and where each one appears in this tool.

Blue = printable ASCII character  ยท  Grey = control or non-printable  ยท  Hover any cell to see values
โ†“HiยทLoโ†’0123456789ABCDEF
0000102030405060708090A0B0C0D0E0F
1101112131415161718191A1B1C1D1E1F
220 21!22"23#24$25%26&27'28(29)2A*2B+2C,2D-2E.2F/
33003113223333443553663773883993A:3B;3C<3D=3E>3F?
440@41A42B43C44D45E46F47G48H49I4AJ4BK4CL4DM4EN4FO
550P51Q52R53S54T55U56V57W58X59Y5AZ5B[5C\5D]5E^5F_
660`61a62b63c64d65e66f67g68h69i6Aj6Bk6Cl6Dm6En6Fo
770p71q72r73s74t75u76v77w78x79y7Az7B{7C|7D}7E~7F
8808182838485868788898A8B8C8D8E8F
9909192939495969798999A9B9C9D9E9F
AA0A1A2A3A4A5A6A7A8A9AAABACADAEAF
BB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF
CC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
DD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF
EE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF
FF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF
High nibble down the left side ยท Low nibble across the top ยท Row 4 column 1 = 41 hex = 65 decimal = letter A
The larger units
UnitEqual toExample
Kilobyte (KB)1,024 bytesThe moov index in the reference file is 273 KB
Megabyte (MB)1,024 KBThe mdat block in the reference file is 79 MB
Gigabyte (GB)1,024 MBTesla vehicles are typically supplied with a 128 GB USB drive
Terabyte (TB)1,024 GBโ€”
Why 1,024 and not 1,000?

Because computers count in base 2. The nearest power of 2 to 1,000 is 2ยนโฐ = 1,024. Storage sizes follow powers of 2 โ€” the same reason bytes have 8 bits and not 10. This also explains why a drive advertised as 128 GB by a manufacturer shows as approximately 119 GB in an operating system โ€” manufacturers count in decimal (128,000,000,000 bytes) while operating systems report in binary (128 ร— 2ยณโฐ bytes). Same drive, different counting system.

Bitmask

When data is stored in binary, individual bytes often carry more than one piece of information packed together. Rather than waste a whole byte on a single small value, engineers pack multiple values into the same byte โ€” each occupying a different group of bits.

Think of it like this

Imagine a traffic light junction controller that needs to send the status of four sets of lights โ€” North, South, East, West โ€” to a monitoring system. Rather than sending four separate signals it packs all four into one byte. Each light gets two bits โ€” enough to represent red, amber, green, or off. One byte, four junctions, eight bits, all sent in a single transmission.

The monitoring system receives the byte and needs to extract just the North light status. It does not care about the other six bits. So it applies a mask that covers exactly those two bit positions and zeros out everything else. What comes out is just the North status, isolated cleanly from the rest.

This is exactly what happens in this file. The NAL header byte carries both the NAL reference indicator and the NAL unit type packed together. The protobuf tag byte carries both the field number and the wire type. Bitmasking is how you pull them apart.

The AND operation

A bitmask uses the AND (&) operation. AND compares two bits at a time and follows one rule โ€” the only way to get a 1 out is if both inputs are 1. Everything else produces 0.

Input AInput BResult
111
100
010
000

Set 1 in the mask where you want to keep a bit. Set 0 where you want to discard it. ANDing with 0 always produces 0 regardless of the input โ€” the bit is wiped. ANDing with 1 always produces whatever the input was โ€” the bit is kept.

Common masks in this file
MaskBinaryKeepsUsed for
0x1F00011111Bottom 5 bitsNAL unit type from NAL header byte
0x0700000111Bottom 3 bitsWire type from protobuf tag byte
Worked example 1 โ€” NAL type from header byte 0x67

The NAL header byte 0x67 packs three values together. The bottom 5 bits carry the NAL unit type. To extract them apply the mask 0x1F (00011111):

Result: 00000111 = 7 = NAL type 7 (SPS). The top three bits (011) were discarded. The bottom five survived intact.

Worked example 2 โ€” wire type from protobuf tag byte 0x25

The protobuf tag byte 0x25 packs the field number (top 5 bits) and wire type (bottom 3 bits) together. To extract the wire type apply the mask 0x07 (00000111):

Result: 00000101 = 5 = wire type 5 (32-bit fixed). Four data bytes follow.

Bit shifting โ€” extracting the field number

Once the wire type bits are extracted by masking, the field number sits in the top 5 bits of the original byte. To read it as a plain number, shift all the bits right by 3 positions โ€” this discards the bottom three bits and moves the field number down to where it can be read directly.

0x25 = 00100101  โ†’  shift right 3  โ†’  00000100 = 4 = field 4 (vehicle speed)

Mask for wire type + shift for field number. Together they fully decode any protobuf tag byte. This is covered in detail in the Protobuf section.

Where this leads

Bitmasking appears in two places in this tool. The NAL & SEI section uses 0x1F to extract the NAL unit type from each header byte. The Protobuf section uses 0x07 to extract the wire type from each tag byte. Both stepper walkthroughs show the AND operation applied to the actual bytes from the reference file.

The MP4 container format

An MP4 file is a container โ€” a structured wrapper holding multiple types of data in labelled sections called boxes. Every box starts with its size in bytes, then a four-character name. Boxes nest inside each other like Russian dolls.

Think of it like this

Imagine a removal van. Open the back: labelled boxes. Open a box: sealed envelopes. Open an envelope: a letter. A video file works the same way โ€” nested containers. The video on screen is just one box. Inside the others is data that never appears during normal playback.

2026-05-04_16-05-52-front.mp4  ยท  ~79 MB total
ftyp 32 bytes 0x00
File Type box โ€” declares this is a valid MP4 file and which MP4 variant it uses. Always the first box in any MP4 file. 32 bytes โ€” tiny but mandatory.
free 8 bytes 0x20
Free space box โ€” empty padding. No forensic significance. Some encoders write this to reserve space for the moov index before writing begins.
mdat ~79 MB ยท 99.7% of the file 0x28
Inside mdat โ€” 2,174 frame groups
SPS config
PPS config
SEI telemetry
IDR video frame
ร— 2,174 frames  ยท  SEI unit = speed, GPS, steering, gear, brakes, autopilot
Media Data box โ€” contains every video frame and every embedded SEI telemetry unit recorded during the clip. Grows continuously as recording proceeds. Written first. This is where the forensic data lives. Even if the file appears unreadable, this block is physically present on the drive.
moov 273 KB end of file
Movie index box โ€” the file's table of contents. Contains timestamps, frame locations, codec configuration, and track information. Written only when recording stops cleanly. If power is cut at impact this box is never written โ€” leaving the file without a navigable index. A standard video player cannot play the file without moov. The mdat block and its contents should theoretically be present on the drive, though the physical condition of the device and the exact point at which power was lost may affect what is recoverable in practice.
Tap any box for detail

The reference file has four top-level boxes:

BoxOffsetSizeWhat it contains
ftyp0x0032 BFile Type โ€” declares this is MP4. Always first.
free0x208 BEmpty padding. Nothing significant.
mdat0x2879 MBMedia Data โ€” all video frames and embedded SEI telemetry.
moovend273 KBMovie index โ€” timestamps, frame locations. Written last when recording stops cleanly.
Forensic significance โ€” IsStreamable: No

Tesla records continuously into mdat and only writes moov when recording stops cleanly. Power cut at impact โ†’ moov may never be written โ†’ file appears unreadable in a standard video player. The raw mdat block and the SEI telemetry units inside it should theoretically be present on the drive โ€” however recoverability depends on the physical condition of the device and the precise point of power loss. Absence of a readable file is not necessarily absence of data.

NAL units and SEI telemetry

Inside mdat the video stream is divided into chunks called NAL units (Network Abstraction Layer). Each starts with a one-byte header identifying its type. In the avcC format used here, each NAL unit is also preceded by a 4-byte length field.

Think of it like this

NAL units are standardised shipping containers. The one-byte header is the label โ€” Type 5 is a video frame, Type 7 is config paperwork, Type 6 is a reserved container for custom cargo. The manufacturer fills Type 6 with telemetry data, one per frame, attached to every frame of dashcam footage unseen by normal video players.

Type byteNameContents
0x07SPSCodec config โ€” resolution, frame rate, profile. Written once at stream start.
0x08PPSPicture config. Housekeeping, not video content.
0x06SEISupplemental Enhancement Information โ€” vendor custom data. One per frame here.
0x05IDR FrameA complete keyframe โ€” the actual video content.

Each SEI unit contains a 16-byte UUID starting 42 42 42 69, followed by 66 bytes of protobuf-encoded telemetry. The SEI Explorer tool recognises this UUID and decodes it across all 2,174 frames.

Search result โ€” verified

Searching the 79MB file for 42 42 42 69 08 returned 2,175 hits โ€” 2,174 genuine SEI units plus one coincidental byte match in the compressed video data. The genuine count matches MediaInfo's frame count exactly.

89
bytes per SEI unit
1 NAL type + 1 payload type + 1 size + 16 UUID + 66 protobuf
2,174
SEI units in file
One per frame. Written at time of recording, not added afterwards.

IEEE 754 floating point

IEEE 754 is the published international standard for storing decimal numbers in binary โ€” used in virtually every processor, language, and file format on earth. Used here for vehicle speed, steering angle, accelerator pedal position, and GPS coordinates.

Before you start

This section assumes familiarity with binary โ€” why computers use 0s and 1s, how bit positions work, and why each column doubles in value. If any of that is unfamiliar, the Binary section covers it in full with interactive examples. This section picks up from there.

The core idea. Think of a calculator showing 1.25 ร— 10โด. It stores two things separately โ€” the significant digits (1.25) and the scale (ร—10,000). IEEE 754 does exactly the same thing in binary. The significant digits are called the mantissa. The scale is the exponent. A single sign bit says positive or negative. The full decode follows step by step below.
Step 0 โ€” Raw bytes and reversal
The bytes from the file are 82 2D 48 41. The file uses little endian byte order โ€” least significant byte first. Reverse them before applying IEEE 754: 41 48 2D 82.
Why reverse?

Little-endian stores the smallest part of a number first โ€” like writing a date as day/month/year instead of year/month/day. IEEE 754 expects the bytes in big endian order (most significant first). Always reverse multi-byte values from this file before decoding.

Step 1 โ€” All 32 bits, colour coded
Convert each reversed byte to 8 binary digits. 41 โ†’ 01000001, 48 โ†’ 01001000, 2D โ†’ 00101101, 82 โ†’ 10000010. Concatenate to get 32 bits.
โ† Sign (1 bit) โ† Exponent (8 bits) โ† Mantissa (23 bits) โ†’
Sign
Exponent
Mantissa
Step 2 โ€” Sign bit
The first bit is 0. Simple rule: 0 = positive, 1 = negative. This value is positive. For vehicle data, a sign bit of 1 on the speed field would indicate the vehicle is in reverse.
Step 3 โ€” Exponent bits โ†’ decimal โ†’ subtract bias
The bias โ€” think of it like a thermometer

The 8 exponent bits need to represent both very large and very small numbers โ€” meaning positive and negative exponents. But 8 bits can only store 0 to 255, with no negatives. The solution is a bias of 127 โ€” like a thermometer where 0ยฐC is physically marked at position 127. Any stored value above 127 is a positive exponent. Below 127 is negative. Always subtract 127 to find the actual exponent.

The 8 exponent bits are 10000010. Each bit position is worth a power of 2. A 1 bit contributes its value. A 0 bit contributes nothing.
PositionBitWorthContribution
7 (leftmost)12โท = 128128
602โถ = 640
502โต = 320
402โด = 160
302ยณ = 80
202ยฒ = 40
112ยน = 22
0 (rightmost)02โฐ = 10
Total (stored exponent)128 + 2 = 130
Subtract bias (127)130 โˆ’ 127 = 3
Why 127? It sits exactly in the middle of 0โ€“255 โ€” the range 8 bits can hold. Values above 127 give a positive exponent. Values below 127 give a negative exponent. 127 was deliberately chosen so the exponent can represent both very large and very small numbers using the same 8 bits. Not an arbitrary number โ€” the midpoint of the range.
Actual exponent3 โ†’ multiply by 2ยณ = 8
The exponent is just a count โ€” how many 2s to multiply together

The exponent 3 means multiply 2 by itself 3 times: 2 ร— 2 ร— 2 = 8. That is all it means. If the exponent were 10 it would be ten 2s: 2 ร— 2 ร— 2 ร— 2 ร— 2 ร— 2 ร— 2 ร— 2 ร— 2 ร— 2 = 1,024. If the exponent were 1 it would be just one 2 = 2. If it were 0 it would be zero 2s = 1 (anything to the power of zero is always 1). Negative exponents go the other way โ€” instead of multiplying by 2 you divide by 2. Exponent โˆ’1 = 1 รท 2 = 0.5. Exponent โˆ’3 = 1 รท 2 รท 2 รท 2 = 0.125. The reason it is always 2 and never 3 or 10 is exactly what the base 2 section above explains โ€” computers only understand 2 states, so the only scale that makes sense is powers of 2.

Step 4 โ€” Mantissa (the "makeweight") โ€” bit by bit
Where does "mantissa" come from?

It is a Latin word meaning makeweight โ€” the small extra weight a trader added to a scale to bring it to an exact balance after the main weights were set. The mathematician Henry Briggs used it in the 17th century for logarithm tables. The mantissa was the fractional part that gave you the precise digits after the exponent set the rough scale. IEEE 754 uses it for exactly the same reason โ€” the exponent sets the scale, the mantissa fine-tunes it to the exact value. Some textbooks use the word significand instead, which is more descriptive but less commonly used.

The add / skip rule โ€” stated plainly

Every row in the table below has a bit value of 1 or 0.
Bit = 1 โ†’ Add that row's decimal value to the running total.
Bit = 0 โ†’ Skip it. It contributes nothing. The running total does not change.

The power notation (2โปยน, 2โปยฒ, 2โปยณโ€ฆ) and the fraction notation (1/2, 1/4, 1/8โ€ฆ) are exactly the same value written two different ways. Both columns are shown throughout so you can see they are identical.

There is also an implied leading 1 that is never written down in the file โ€” just as scientific notation assumes a non-zero leading digit. It is always added first before any of the 23 bits are processed.
The 23 mantissa bits are 10010000010110110000100. Every position shown:
Position Bit Power Same as fraction Decimal value Action (1=add, 0=skip) Running total
โ€”โ€”โ€”โ€”1.000000Implied 1 โ€” always add1.000000
112โปยน1/20.500000โœ“ Add1.500000
202โปยฒ1/40.250000โ€” Skip1.500000
302โปยณ1/80.125000โ€” Skip1.500000
412โปโด1/160.062500โœ“ Add1.562500
502โปโต1/320.031250โ€” Skip1.562500
602โปโถ1/640.015625โ€” Skip1.562500
702โปโท1/1280.007813โ€” Skip1.562500
802โปโธ1/2560.003906โ€” Skip1.562500
902โปโน1/5120.001953โ€” Skip1.562500
1012โปยนโฐ1/1,0240.000977โœ“ Add1.563477
1102โปยนยน1/2,0480.000488โ€” Skip1.563477
1212โปยนยฒ1/4,0960.000244โœ“ Add1.563721
1312โปยนยณ1/8,1920.000122โœ“ Add1.563843
1402โปยนโด1/16,3840.000061โ€” Skip1.563843
1512โปยนโต1/32,7680.000031โœ“ Add1.563873
1612โปยนโถ1/65,5360.000015โœ“ Add1.563889
1702โปยนโท1/131,0720.000008โ€” Skip1.563889
1802โปยนโธ1/262,1440.000004โ€” Skip1.563889
1902โปยนโน1/524,2880.000002โ€” Skip1.563889
2002โปยฒโฐ1/1,048,5760.000001โ€” Skip1.563889
2102โปยฒยน1/2,097,1520.0000005โ€” Skip1.563889
2212โปยฒยฒ1/4,194,3040.0000002โœ“ Add1.563889
2302โปยฒยณ1/8,388,6080.0000001โ€” Skip1.563889
Mantissa total (implied 1 + all 23 bits)1.5639
Note: by position 22 the added values are so small (less than one millionth) that they no longer change the displayed total โ€” but they are still present and still matter for full precision.
Another way to think about it โ€” the bank queue ยท analogy by Noel Lowdon, Harper Shaw Investigation Consultants Ltd

Imagine 23 people queuing at a bank counter. Before they joined the queue, each person was designated either a 1 or a 0 โ€” assigned when they arrived, not their choice.


Each person has an amount to pay in. The person at the front of the queue โ€” person 1, first at the counter โ€” has 50p. The person behind them has 25p. The next 12.5p. Every person has exactly half the amount of the person in front of them. By the time you reach the back of the queue the amounts are vanishingly small โ€” but they are still real and they still count.


Before the queue even starts moving, the cashier reaches under the counter and pays in ยฃ1 from the till. "That one is always included. No exceptions. Every time." That is the implied leading 1 โ€” it is never held by anyone in the queue, never written in the binary, but always paid in first without fail.


Then the cashier works through the queue one person at a time from the front.


If a person was designated 1 โ€” the cashier takes their amount and pays it into the account.


If a person was designated 0 โ€” the cashier waves them past. They keep their amount. Nothing goes into the account.


When all 23 people have been processed, the cashier looks at the account balance โ€” the ยฃ1 paid in at the start, plus whatever the 1-designated people contributed. That total is your mantissa value.


We understand Noel has no difficulty grasping the value at the front of the queue, but would rather not be the one standing at the back.

Step 5 โ€” Final calculation
Sign
0 โ†’ positive (+1)
Exponent
130 โˆ’ 127 = 3 โ†’ ร— 2ยณ = ร— 8
zoom level โ€” the scale
Mantissa
1.5639
the significant digits
Formula
(+1) ร— 1.5639 ร— 8
Result
12.511 m/s = 45.04 km/h
The zoom lens analogy

The exponent is the zoom level โ€” it sets the scale of the number. The mantissa is what you see through the lens โ€” the actual digits. Change the zoom (exponent) and the same digits (mantissa) represent a completely different magnitude. A speed of 0.07 m/s and 45 m/s have very similar mantissa values but different exponents.

โœ“
Verified: Tesla SEI Explorer CSV value for frame 1 = 12.511110 m/s. Manual decode = 12.511 m/s. Match confirmed.
Summary โ€” the complete picture
Everything above, collapsed into one view. This is what IEEE 754 does to the four bytes 82 2D 48 41.
Sign
1 bit
Exponent
8 bits
Mantissa
23 bits
Sign bit
0
= positive
0 = positive
1 = negative
ร—
Exponent
10000010
= 130
130 โˆ’ 127 = 3
127 is the bias โ€” it sits exactly in the middle of 0โ€“255, letting the exponent go positive or negative. Not arbitrary โ€” deliberately chosen.
โ†’ ร— 2ยณ = ร— 8
ร—
Mantissa
1001000โ€ฆ
23 bits
implied 1 + fractions
= 1.5639
Always starts with an implied 1. Each bit adds half the value of the previous. 1 = add it, 0 = skip it.
โ†’ 1.5639
(+1) ร— 1.5639 ร— 8 =
12.511 m/s
= 45.04 km/h
GPS coordinates use 64-bit doubles โ€” same process, different numbers

GPS latitude and longitude follow exactly the same three-step process โ€” sign, exponent, mantissa โ€” but use 8 bytes instead of 4. The bit split is 1 sign bit, 11 exponent bits, 52 mantissa bits. The bias is 1023 instead of 127 (again sitting in the middle of 0โ€“2047). The result is roughly 15 significant figures of precision instead of 7 โ€” enough to locate a vehicle to sub-millimetre accuracy rather than within 1โ€“2 metres.

Protocol Buffers

Google's Protocol Buffers โ€” protobuf for short โ€” is a compact binary format for structured data. It is used here to encode the vehicle telemetry inside each SEI unit. Unlike JSON or XML which spell out field names as readable text, protobuf uses numbers โ€” making it significantly smaller and faster to decode.

Every field in a protobuf message is written as a tag followed by the data. The tag is always one byte. The data that follows depends on what the tag says.

The tag byte

The tag byte packs two pieces of information into one byte โ€” the field number and the wire type. If you have read the Bitmask section you already know how this works. The bottom 3 bits hold the wire type. The top 5 bits hold the field number. You extract them using AND masking and bit shifting.

Extracting field number and wire type

Wire type โ€” AND with 0x07 (bottom 3 bits):  tag & 0x07 = wire type
Field number โ€” shift right by 3:  tag >> 3 = field number

Example โ€” tag byte 0x25 (vehicle speed)
0x25 in binary: 00100101
Wire type: 00100101 & 00000111 = 00000101 = 5 (32-bit fixed โ€” 4 bytes follow)
Field number: 00100101 >> 3 = 00000100 = 4 (vehicle_speed_mps)

Not sure how the binary arithmetic works? See the Bitmask section.

Wire types โ€” what each one means

The wire type tells the decoder how the data is formatted and how many bytes to read. Without it the decoder would not know where one field ends and the next begins. Three wire types appear in this file:

Wire typeNameBytesUsed for
0VarintVariableFrame sequence number, gear state, version
164-bit fixedAlways 8GPS latitude, longitude, heading
532-bit fixedAlways 4Vehicle speed, steering, accelerator, acceleration

Wire types 2, 3, and 4 exist in the protobuf specification but do not appear in this file.

Default values and absence

Protobuf has an important space-saving rule โ€” if a field holds its default value it is not written to the binary at all. For a booleanBooleanA value that can only be true or false. In protobuf, a boolean field with the value false is not written to the binary at all โ€” absence means false, not missing data. the default is false. For an integerIntegerA whole number with no fractional part โ€” positive, negative, or zero. In protobuf, integers are stored as varints. Frame sequence number and gear state are integers. the default is zero. For an enumEnumShort for enumeration. A field that can only hold one of a fixed set of named values. Gear state is an enum โ€” it can only be GEAR_DRIVE, GEAR_REVERSE, GEAR_NEUTRAL, or GEAR_PARK. the default is the first value in the list.

This is why the brake, blinker, and autopilot fields are absent from every frame in this file. Their default is false. Protobuf does not write them. Absence is not missing data โ€” it is the encoding precisely and verifiably stating that the value was false.

Forensic significance

Any examiner familiar with the Protocol Buffers specification can independently confirm this. The specification is published and freely available. It is not possible for a boolean field to be absent while its value was true โ€” if it were true, the byte sequence for that field would be present in the binary.

Varints โ€” variable length integers

For whole numbers, protobuf uses a variable length encoding called a varint. Instead of always using 4 bytes for a number, it uses only as many bytes as needed. The number 1 needs one byte. The number 150,030 needs three.

Each byte in a varint contributes 7 data bits. The 8th bit โ€” the most significant bit โ€” is a continuation flag. If it is 1, more bytes follow. If it is 0, this is the last byte.

Think of it like a relay race

Each runner carries 7 bits of the number. If they pass the baton on (MSB = 1) the next runner carries more. If they cross the finish line (MSB = 0) the number is complete. The decoder keeps reading bytes until it finds one with MSB = 0.

Worked example โ€” frame sequence number 150,030

Tag 0x18 = field 3, wire type 0 (varint). Three data bytes follow: 8E 94 09

ByteBinaryMSBStatus7 data bits
8E100011101More follows0001110
94100101001More follows0010100
09000010010Last byte0001001

Concatenate the 7-bit groups in reverse order โ€” protobuf varints are little-endian, least significant group first:

0001001 ยท 0010100 ยท 0001110 = 000100100101000001110 = 150,030

Verified

Tesla SEI Explorer CSV: frame_seq_no = 150030. Manual decode: 150,030. Match confirmed. This frame sequence number indicates approximately 69 minutes of prior recording existed on the drive before this clip begins.

Common tag values in this file
TagFieldWire typeData type
0x081 โ€” version0 (varint)Integer
0x102 โ€” gear state0 (varint)Enum
0x183 โ€” frame sequence no.0 (varint)Integer
0x254 โ€” vehicle speed5 (32-bit)IEEE 754 float
0x2D5 โ€” accelerator pedal5 (32-bit)IEEE 754 float
0x356 โ€” steering angle5 (32-bit)IEEE 754 float
0x5911 โ€” latitude1 (64-bit)IEEE 754 double
0x6112 โ€” longitude1 (64-bit)IEEE 754 double
0x6913 โ€” heading1 (64-bit)IEEE 754 double
0x7114 โ€” accel X5 (32-bit)IEEE 754 float
0x7915 โ€” accel Y5 (32-bit)IEEE 754 float
0x7D16 โ€” accel Z5 (32-bit)IEEE 754 float

GPS coordinates โ€” 64-bit doubles

Speed and steering use 32-bit floats โ€” 4 bytes, ~7 significant figures. GPS coordinates use 64-bit doubles โ€” 8 bytes, ~15 significant figures. The conversion is identical to IEEE 754 float but with exponent bias 1023 instead of 127.

Why the extra precision matters

A 32-bit float locates you to within ~1โ€“2 metres. A 64-bit double locates you to within a fraction of a millimetre. The CSV value reads 53.72891032171984 not 53.72891 โ€” those extra digits are real data, not noise. For forensic GPS evidence that precision is essential.

Verified values from frame 1: latitude 53.7289ยฐN, longitude -1.6932ยฐW โ€” Brighouse/Halifax area, West Yorkshire. By frame 2,174 heading has rotated from 253ยฐ to 215ยฐ, consistent with steering angle data showing a gradual left turn.

53.7289ยฐN
latitude ยท frame 1
West Yorkshire. CSV: 53.72891032171984
253ยฐโ†’215ยฐ
heading across clip
Consistent with steering 0.2ยฐโ†’โˆ’11ยฐ. Three independent data fields in agreement.

Why this methodology stands up

The complete chain โ€” from road to report

Vehicle driven โ†’ SEI written per frame โ†’ USB recovered โ†’ MP4 located โ†’ container parsed (MediaInfo) โ†’ binary examined (010 Editor) โ†’ SEI units located by binary search โ†’ bytes decoded (IEEE 754 + protobuf) โ†’ values verified (SEI Explorer CSV) โ†’ findings reported. Every step documented. Every value traceable to a specific byte offset. Every conversion using published mathematics checkable by any qualified examiner independently.

Data written at time of recording. SEI is embedded per-frame by the vehicle's own systems. Cannot be added retrospectively without re-encoding the entire stream, which changes the file hash.

Three independent tools, consistent results. MediaInfo timestamps match encoded dates. Hand-decoded bytes match the SEI Explorer CSV exactly. 010 Editor confirms the container structure MediaInfo reported.

False values provably absent, not assumed. Protobuf omits fields at their default value. Brake=false, indicators=false, autopilot=NONE are absent from every frame's binary payload. Absence is the proof โ€” not missing data, but the encoding working exactly as the published specification says.

3
independent tools
MediaInfo ยท 010 Editor ยท SEI Explorer โ€” consistent results throughout.
2,174
frames verified
Gear=Drive, Autopilot=None, Brake=false in every single frame.

As we say at Harper Shaw: assume nothing, believe nobody, check everything.

Glossary

Tesla Dashcam SEI Explorer
Screenshot from live forensic session ยท 9 May 2026 ยท File: 2026-05-04_16-05-52-front.mp4 ยท Frame 1 of 2,174
Tesla SEI Explorer showing dashcam footage with decoded telemetry panel
What you are looking at The Tesla SEI Explorer running in a browser, loaded with the reference file 2026-05-04_16-05-52-front.mp4. The dashcam footage plays on the left. The panel on the right shows the telemetry decoded from the SEI data embedded in that exact frame โ€” the same bytes that are colour-coded in the Hex Map tab. Frame 1 of 2,174. All processing happens locally in the browser; no data is uploaded.
What this tab shows
This is the Tesla SEI Explorer โ€” a browser tool that reads the embedded telemetry from dashcam MP4 files and displays it alongside the footage. The decoded values on the right of the screenshot came from bytes physically present in the file. Those same bytes are what the Hex Map tab colour-codes and the stepper walks through. This is the end result of the decode process.
Field by field โ€” frame 1 of 2,174
Frame Seq No 150030 โ€” varint decoded from 18 8E 94 09. Places this clip ~69 minutes into the drive.
Vehicle Speed 12.51 m/s โ€” IEEE 754 float from 25 82 2D 48 41. = 45.04 km/h.
Gear State GEAR_DRIVE โ€” protobuf enum from 10 01. Value 1 = Drive.
Brake / Blinkers / Autopilot โ€” false/NONE โ€” absent from the binary. Protobuf omits default values. Absence is the proof, not an assumption.
Latitude 53.73 / Longitude -1.69 โ€” 64-bit doubles, 8 bytes each. West Yorkshire confirmed.
Heading 253.47ยฐ โ€” WSW. Rotates to ~215ยฐ by frame 2,174, consistent with steering angle and lateral acceleration data independently confirming a gradual left turn.
Accelerator Pedal 15.60% โ€” IEEE 754 float. Throttle application as a percentage of full depression at frame 1.
Steering Angle 0.200ยฐ โ€” IEEE 754 float. Rotates from 0.2ยฐ to โˆ’11ยฐ across the clip โ€” consistent with a gradual left turn confirmed by heading and lateral acceleration data.
Accel X 0.070 m/sยฒ โ€” longitudinal (forward/backward). Near zero โ€” consistent with steady speed. No braking or acceleration event detected.
Accel Y 0.210 m/sยฒ โ€” lateral (left/right). Small positive value consistent with a gentle left turn. Independently confirmed by steering angle and heading data.
Accel Z 0.160 m/sยฒ โ€” vertical (up/down). Near zero โ€” normal road surface. No significant vertical event during this clip.
Learn