new fixed datatypes
This commit is contained in:
parent
4292bd5358
commit
2ccceedda9
2 changed files with 73 additions and 4 deletions
69
Fixed.go
Normal file
69
Fixed.go
Normal file
|
@ -0,0 +1,69 @@
|
|||
// Copyright 2024 Martin Riedl
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package gomp4
|
||||
|
||||
import "encoding/binary"
|
||||
|
||||
type Fixed88 struct {
|
||||
b []byte
|
||||
}
|
||||
|
||||
func NewFixed88ByBytes(b []byte) Fixed88 {
|
||||
return Fixed88{
|
||||
b: b,
|
||||
}
|
||||
}
|
||||
|
||||
func (fixed Fixed88) ToUInt16() uint16 {
|
||||
return uint16(fixed.b[0])
|
||||
}
|
||||
|
||||
func (fixed Fixed88) ToFloat32() float32 {
|
||||
var result float32 = 0
|
||||
|
||||
a := uint16(fixed.b[0])
|
||||
b := uint16(fixed.b[1])
|
||||
|
||||
result += float32(a)
|
||||
result += float32(b) / 1_000 // max of uint8 is 255
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
type Fixed1616 struct {
|
||||
b []byte
|
||||
}
|
||||
|
||||
func NewFixed1616ByBytes(b []byte) Fixed1616 {
|
||||
return Fixed1616{
|
||||
b: b,
|
||||
}
|
||||
}
|
||||
|
||||
func (fixed Fixed1616) ToUInt16() uint16 {
|
||||
return binary.BigEndian.Uint16(fixed.b[0:2])
|
||||
}
|
||||
|
||||
func (fixed Fixed1616) ToFloat32() float32 {
|
||||
var result float32 = 0
|
||||
|
||||
a := binary.BigEndian.Uint16(fixed.b[0:2])
|
||||
b := binary.BigEndian.Uint16(fixed.b[2:4])
|
||||
|
||||
result += float32(a)
|
||||
result += float32(b) / 100_000 // max of uint16 is 65535
|
||||
|
||||
return result
|
||||
}
|
|
@ -58,10 +58,10 @@ type MovieHeaderBox struct {
|
|||
DurationV1 uint64
|
||||
// is a fixed point 16.16 number that indicates the preferred rate to play the presentation; 1.0
|
||||
// (0x00010000) is normal forward playback
|
||||
Rate int32
|
||||
Rate Fixed1616
|
||||
// is a fixed point 8.8 number that indicates the preferred playback volume. 1.0 (0x0100) is
|
||||
// full volume.
|
||||
Volume int16
|
||||
Volume Fixed88
|
||||
// provides a transformation matrix for the video; (u,v,w) are restricted here to (0,0,1), hex
|
||||
// values (0,0,0x40000000).
|
||||
Matrix []int32
|
||||
|
@ -94,8 +94,8 @@ func ParseMovieHeaderBox(filePosition uint64, headerSize uint32, content []byte)
|
|||
position += 16
|
||||
}
|
||||
|
||||
box.Rate = int32(binary.BigEndian.Uint32(content[position : position+4]))
|
||||
box.Volume = int16(binary.BigEndian.Uint16(content[position+4 : position+6]))
|
||||
box.Rate = NewFixed1616ByBytes(content[position : position+4])
|
||||
box.Volume = NewFixed88ByBytes(content[position+4 : position+6])
|
||||
position += 4 + 2 + 2 + 8 // 4 bytes for rate, 2 bytes for volume, 2 bytes reserved and 8 bytes reserved
|
||||
for i := 0; i < 9; i++ {
|
||||
box.Matrix = append(box.Matrix, int32(binary.BigEndian.Uint32(content[position:position+4])))
|
||||
|
|
Loading…
Add table
Reference in a new issue