Skip to content

Commit 4396425

Browse files
committed
Add t35_identifier_length and move descr to hrsd
1 parent 7dbb3ef commit 4396425

File tree

14 files changed

+354
-191
lines changed

14 files changed

+354
-191
lines changed

IsoLib/isoiff_tool/w32/isoiff/isoiff.dsp

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

IsoLib/libisomediafile/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ add_library(
7171
src/H263SpecificInfoAtom.c
7272
src/HandlerAtom.c
7373
src/HEVCConfigAtom.c
74+
src/HumanReadableStreamDescriptionAtom.c
7475
src/LHEVCConfigAtom.c
7576
src/VVCConfigAtom.c
7677
src/VVCNALUConfigAtom.c

IsoLib/libisomediafile/linux/libisomediafile/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ sources = \
158158
TextMetaSampleEntry.c \
159159
XMLMetaSampleEntry.c \
160160
BitRateAtom.c \
161+
HumanReadableStreamDescriptionAtom.c \
161162
AMRWPSpecificInfoAtom.c \
162163
AMRSpecificInfoAtom.c \
163164
H263SpecificInfoAtom.c \

IsoLib/libisomediafile/macosx/libisomediafile/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ sources = \
158158
TextMetaSampleEntry.c \
159159
XMLMetaSampleEntry.c \
160160
BitRateAtom.c \
161+
HumanReadableStreamDescriptionAtom.c \
161162
AMRWPSpecificInfoAtom.c \
162163
AMRSpecificInfoAtom.c \
163164
H263SpecificInfoAtom.c \
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
/*
2+
Copyright 2026 Google LLC
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
#include "MP4Atoms.h"
18+
#include <stdlib.h>
19+
20+
static void destroy(MP4AtomPtr s)
21+
{
22+
MP4HumanReadableStreamDescriptionAtomPtr self;
23+
self = (MP4HumanReadableStreamDescriptionAtomPtr)s;
24+
if(self == NULL) return;
25+
26+
if(self->description)
27+
{
28+
free(self->description);
29+
self->description = NULL;
30+
}
31+
32+
if(self->super) self->super->destroy(s);
33+
}
34+
35+
static MP4Err serialize(struct MP4Atom *s, char *buffer)
36+
{
37+
MP4Err err;
38+
MP4HumanReadableStreamDescriptionAtomPtr self = (MP4HumanReadableStreamDescriptionAtomPtr)s;
39+
err = MP4NoErr;
40+
41+
err = MP4SerializeCommonBaseAtomFields(s, buffer);
42+
if(err) goto bail;
43+
buffer += self->bytesWritten;
44+
assert(self->type == MP4HumanReadableStreamDescriptionAtomType);
45+
46+
/* Write description as null-terminated UTF-8 string */
47+
if(self->description != NULL)
48+
{
49+
u32 descLen = (u32)strlen(self->description) + 1; /* Include null terminator */
50+
PUTBYTES(self->description, descLen);
51+
}
52+
else
53+
{
54+
/* Empty description: just write '\0' */
55+
u8 nullByte = 0;
56+
PUT8_V(nullByte);
57+
}
58+
59+
assert(self->bytesWritten == self->size);
60+
bail:
61+
TEST_RETURN(err);
62+
63+
return err;
64+
}
65+
66+
static MP4Err calculateSize(struct MP4Atom *s)
67+
{
68+
MP4Err err;
69+
MP4HumanReadableStreamDescriptionAtomPtr self = (MP4HumanReadableStreamDescriptionAtomPtr)s;
70+
err = MP4NoErr;
71+
72+
err = MP4CalculateBaseAtomFieldSize(s);
73+
if(err) goto bail;
74+
/* Add description size (null-terminated string) */
75+
if(self->description != NULL)
76+
{
77+
self->size += (u32)strlen(self->description) + 1; /* Including '\0' */
78+
}
79+
else
80+
{
81+
self->size += 1; /* Just '\0' */
82+
}
83+
bail:
84+
TEST_RETURN(err);
85+
86+
return err;
87+
}
88+
89+
static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStreamPtr inputStream)
90+
{
91+
MP4Err err;
92+
MP4HumanReadableStreamDescriptionAtomPtr self = (MP4HumanReadableStreamDescriptionAtomPtr)s;
93+
s64 bytesToRead;
94+
u32 nullPos;
95+
u32 descLen;
96+
u8 *buf = NULL;
97+
u32 i;
98+
99+
if(self == NULL) BAILWITHERROR(MP4BadParamErr)
100+
err = self->super->createFromInputStream(s, proto, (char *)inputStream);
101+
if(err) goto bail;
102+
103+
/* Read all remaining bytes into a flat buffer, then split on the first null byte.
104+
* Scanning byte-by-byte and "rewinding" by adjusting only bytesRead (while leaving
105+
* the stream cursor in place) does not work — readData always reads from the current
106+
* stream position. */
107+
bytesToRead = (s64)(self->size - self->bytesRead);
108+
if(bytesToRead < 0) BAILWITHERROR(MP4BadDataErr);
109+
110+
if(bytesToRead > 0)
111+
{
112+
buf = (u8 *)calloc((u32)bytesToRead, 1);
113+
TESTMALLOC(buf);
114+
err = inputStream->readData(inputStream, (u32)bytesToRead, (char *)buf, NULL);
115+
if(err) goto bail;
116+
self->bytesRead += (u32)bytesToRead;
117+
118+
/* Find the null terminator that ends the description field */
119+
nullPos = (u32)bytesToRead; /* default: no null found */
120+
for(i = 0; i < (u32)bytesToRead; i++)
121+
{
122+
if(buf[i] == 0)
123+
{
124+
nullPos = i;
125+
break;
126+
}
127+
}
128+
129+
/* Description: bytes [0 .. nullPos] (including the null terminator) */
130+
descLen = nullPos + 1; /* length including null */
131+
self->description = (char *)calloc(descLen, 1);
132+
TESTMALLOC(self->description);
133+
memcpy(self->description, buf, descLen);
134+
}
135+
136+
bail:
137+
free(buf);
138+
TEST_RETURN(err);
139+
return err;
140+
}
141+
142+
MP4Err
143+
MP4CreateHumanReadableStreamDescriptionAtom(MP4HumanReadableStreamDescriptionAtomPtr *outAtom)
144+
{
145+
MP4Err err;
146+
MP4HumanReadableStreamDescriptionAtomPtr self;
147+
148+
self = (MP4HumanReadableStreamDescriptionAtomPtr)calloc(
149+
1, sizeof(MP4HumanReadableStreamDescriptionAtom));
150+
TESTMALLOC(self);
151+
152+
err = MP4CreateBaseAtom((MP4AtomPtr)self);
153+
if(err) goto bail;
154+
self->type = MP4HumanReadableStreamDescriptionAtomType;
155+
self->name = "HumanReadableStreamDescription";
156+
self->createFromInputStream = (cisfunc)createFromInputStream;
157+
self->destroy = destroy;
158+
self->calculateSize = calculateSize;
159+
self->serialize = serialize;
160+
*outAtom = self;
161+
bail:
162+
TEST_RETURN(err);
163+
164+
return err;
165+
}

IsoLib/libisomediafile/src/ISOMovies.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -877,20 +877,16 @@ extern "C"
877877
* @ingroup SampleDescr
878878
*
879879
* Properly deserializes the handle returned by MP4GetMediaSampleDescription() and extracts
880-
* the T.35 identifier bytes and optional description string. The caller is responsible for
881-
* freeing *outIdentifier and *outDescription with free().
880+
* the T.35 identifier bytes. The caller is responsible for freeing *outIdentifier with free().
882881
*
883882
* @param sampleEntryH Handle containing the serialized 'it35' sample entry.
884883
* @param outIdentifier Output; receives a newly allocated copy of the t35_identifier bytes.
885-
* @param outIdentifierSize Output; receives the number of bytes in *outIdentifier.
886-
* @param outDescription Optional output; receives a newly allocated description string, or NULL
887-
* if no description is present. Pass NULL to ignore.
884+
* @param outIdentifierLength Output; receives the number of bytes in *outIdentifier.
888885
* @return MP4NoErr on success, MP4NotFoundErr if no identifier is present, MP4BadParamErr on
889886
* invalid input.
890887
*/
891888
ISO_EXTERN(ISOErr)
892-
ISOGetT35SampleEntryFields(MP4Handle sampleEntryH, u8 **outIdentifier, u32 *outIdentifierSize,
893-
char **outDescription);
889+
ISOGetT35SampleEntryFields(MP4Handle sampleEntryH, u8 **outIdentifier, u32 *outIdentifierLength);
894890

895891
/*************************************************************************************************
896892
* VVC Sample descriptions

0 commit comments

Comments
 (0)