mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-08 16:48:18 +00:00
Merge pull request #5670 from Kelimion/jpeg-updates
Small updates to JPEG loader
This commit is contained in:
+15
-13
@@ -642,22 +642,23 @@ JFXX_Extension_Code :: enum u8 {
|
||||
}
|
||||
|
||||
JPEG_Marker :: enum u8 {
|
||||
SOF0 = 0xC0,
|
||||
SOF1 = 0xC1,
|
||||
SOF2 = 0xC2,
|
||||
SOF3 = 0xC3,
|
||||
SOF0 = 0xC0, // Baseline sequential DCT
|
||||
SOF1 = 0xC1, // Extended sequential DCT
|
||||
SOF2 = 0xC2, // Progressive DCT
|
||||
SOF3 = 0xC3, // Lossless (sequential)
|
||||
SOF5 = 0xC5, // Differential sequential DCT
|
||||
SOF6 = 0xC6, // Differential progressive DCT
|
||||
SOF7 = 0xC7, // Differential lossless (sequential)
|
||||
SOF9 = 0xC9, // Extended sequential DCT, Arithmetic coding
|
||||
SOF10 = 0xCA, // Progressive DCT, Arithmetic coding
|
||||
SOF11 = 0xCB, // Lossless (sequential), Arithmetic coding
|
||||
SOF13 = 0xCD, // Differential sequential DCT, Arithmetic coding
|
||||
SOF14 = 0xCE, // Differential progressive DCT, Arithmetic coding
|
||||
SOF15 = 0xCF, // Differential lossless (sequential), Arithmetic coding
|
||||
|
||||
DHT = 0xC4,
|
||||
SOF5 = 0xC5,
|
||||
SOF6 = 0xC6,
|
||||
SOF7 = 0xC7,
|
||||
JPG = 0xC8,
|
||||
SOF9 = 0xC9,
|
||||
SOF10 = 0xCA,
|
||||
SOF11 = 0xCB,
|
||||
DAC = 0xCC,
|
||||
SOF13 = 0xCD,
|
||||
SOF14 = 0xCE,
|
||||
SOF15 = 0xCF,
|
||||
RST0 = 0xD0,
|
||||
RST1 = 0xD1,
|
||||
RST2 = 0xD2,
|
||||
@@ -713,6 +714,7 @@ JPEG_Info :: struct {
|
||||
jfxx_app0: Maybe(JFXX_APP0),
|
||||
comments: [dynamic]string,
|
||||
exif: [dynamic]Exif,
|
||||
frame_type: JPEG_Marker,
|
||||
}
|
||||
|
||||
// Function to help with image buffer calculations
|
||||
|
||||
@@ -219,8 +219,10 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a
|
||||
defer delete(blocks)
|
||||
|
||||
loop: for {
|
||||
// Loop until we find 0xFF.
|
||||
first = compress.read_u8(ctx) or_return
|
||||
if first == 0xFF {
|
||||
(first == 0xFF) or_continue
|
||||
|
||||
marker := cast(image.JPEG_Marker)compress.read_u8(ctx) or_return
|
||||
if expect_EOI && marker != .EOI {
|
||||
return img, .Extra_Data_After_SOS
|
||||
@@ -582,6 +584,11 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a
|
||||
return img, .Invalid_Number_Of_Channels
|
||||
}
|
||||
|
||||
if img.metadata != nil {
|
||||
info := img.metadata.(^image.JPEG_Info)
|
||||
info.frame_type = marker
|
||||
}
|
||||
|
||||
mcu_width = (img.width + 7) / BLOCK_SIZE
|
||||
mcu_height = (img.height + 7) / BLOCK_SIZE
|
||||
block_width = mcu_width
|
||||
@@ -661,6 +668,10 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a
|
||||
case .SOF14: // Differential progressive DCT, Arithmetic coding
|
||||
fallthrough
|
||||
case .SOF15: // Differential lossless (sequential), Arithmetic coding
|
||||
if img.metadata != nil {
|
||||
info := img.metadata.(^image.JPEG_Info)
|
||||
info.frame_type = marker
|
||||
}
|
||||
return img, .Unsupported_Frame_Type
|
||||
case .SOS:
|
||||
if img.channels == 0 && img.depth == 0 && img.width == 0 && img.height == 0 {
|
||||
@@ -1055,7 +1066,6 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a
|
||||
compress.read_slice_from_memory(ctx, cast(int)length) or_return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user