1
1
mirror of https://github.com/wader/fq.git synced 2024-09-11 20:07:11 +03:00

sgpd box entries parsing

Previously entries were parsed as raw bytes, now KIDs/IVs are
explicitely parsed.
This commit is contained in:
Sergei Kuzmin 2023-06-19 21:39:33 -07:00
parent 6ec4def24b
commit e869d8af03
6 changed files with 869 additions and 814 deletions

View File

@ -1367,27 +1367,48 @@ func decodeBox(ctx *decodeContext, d *decode.D, typ string) {
case "sgpd":
version := d.FieldU8("version")
d.FieldU24("flags")
d.FieldUTF8("grouping_type", 4)
var groupingType = d.FieldUTF8("grouping_type", 4)
var defaultLength uint64
if version == 1 {
defaultLength = d.FieldU32("default_length")
}
if version >= 2 {
} else if version >= 2 {
d.FieldU32("default_sample_description_index")
}
entryCount := d.FieldU32("entry_count")
d.FieldArray("entries", func(d *decode.D) {
for i := uint64(0); i < entryCount; i++ {
entryLen := defaultLength
if version == 1 {
if defaultLength == 0 {
entryLen = d.FieldU32("description_length")
} else if entryLen == 0 {
d.Fatalf("sgpd groups entry len <= 0 version 1")
}
d.FieldStructNArray("entries", "entry", int64(entryCount), func(d *decode.D) {
entryLen := defaultLength
if version == 1 {
if defaultLength == 0 {
entryLen = d.FieldU32("description_length")
} else if entryLen == 0 {
d.Fatalf("sgpd groups entry len <= 0")
d.Fatalf("sgpd groups entry len == 0")
}
} else if entryLen == 0 {
// TODO: this is likely a mistake: here version is != 1, so defaultLength is default (i.e. 0),
// TODO: so entryLen is also 0. So for version != 1 this fatal should always throw
d.Fatalf("sgpd groups entry len == 0")
}
// CENC Sample Encryption Info Entries
switch groupingType {
case "seig":
d.FieldU8("reserved")
d.FieldU4("crypto_bytes")
d.FieldU4("skip_bytes")
isEncrypted := d.FieldU8("is_encrypted")
perSampleIVSize := d.FieldU8("per_sample_iv_size")
d.FieldRawLen("kid", 8*16)
if isEncrypted != 0 {
// If perSampleIVSize > 0 then
if perSampleIVSize == 0 {
// This means whole fragment is encrypted with a constant IV
iVSize := d.FieldU8("constant_iv_size")
d.FieldRawLen("constant_iv", 8*int64(iVSize))
}
}
case "roll":
d.FieldU16("roll_distance")
default:
d.FieldRawLen("data", int64(entryLen)*8)
}
})

View File

@ -308,7 +308,8 @@ $ fq -d mp4 dv aac.mp4
0x510| 00 00 00 02 | .... | default_length: 2 0x515-0x518.7 (4)
0x510| 00 00 00 01 | .... | entry_count: 1 0x519-0x51c.7 (4)
| | | entries[0:1]: 0x51d-0x51e.7 (2)
0x510| ff ff | .. | [0]: raw bits data 0x51d-0x51e.7 (2)
| | | [0]{}: entry 0x51d-0x51e.7 (2)
0x510| ff ff | .. | roll_distance: 65535 0x51d-0x51e.7 (2)
| | | [6]{}: box 0x51f-0x53a.7 (28)
0x510| 00| .| size: 28 0x51f-0x522.7 (4)
0x520|00 00 1c |... |

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

BIN
format/mp4/testdata/dash_in.mp4 vendored Normal file

Binary file not shown.