From e398295a2beee67ca90fb536398c638b3df73459 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 26 Mar 2026 10:14:09 +0100 Subject: jpeg: add segments --- src/jpg/frame.zig | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/jpg/frame.zig (limited to 'src/jpg/frame.zig') diff --git a/src/jpg/frame.zig b/src/jpg/frame.zig new file mode 100644 index 0000000..35a6e8e --- /dev/null +++ b/src/jpg/frame.zig @@ -0,0 +1,50 @@ +const std = @import("std"); + +const Self = @This(); + +pub const Component = packed struct(u24) { + identifier: u8, + horizontal_sampling_factor: u4, + vertical_sampling_factor: u4, + quantization_table_destination_selector: u8, +}; + +index: usize, +sample_precision: u8, +number_of_lines: u16, +samples_per_line: u16, +components: []Component, + + +pub fn read( + gpa: std.mem.Allocator, + index: usize, + reader: *std.Io.Reader, +) !Self { + var self: Self = undefined; + + self.index = index; + self.sample_precision = try reader.takeByte(); + self.number_of_lines = try reader.takeInt(u16, .big); + self.samples_per_line = try reader.takeInt(u16, .big); + + const number_of_components = try reader.takeByte(); + + self.components = try gpa.alloc(Component, number_of_components); + errdefer gpa.free(self.components); + + for (self.components) |*component| { + component.identifier = try reader.takeByte(); + const sampling = try reader.takeByte(); + component.horizontal_sampling_factor = @truncate(sampling >> 4); + component.vertical_sampling_factor = @truncate(sampling); + component.quantization_table_destination_selector = try reader.takeByte(); + } + + return self; +} + +pub fn deinit(self: *Self, gpa: std.mem.Allocator) void { + gpa.free(self.components); + self.* = undefined; +} -- cgit v1.2.3-70-g09d2