Skip to content

Commit eff63d3

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

File tree

14 files changed

+350
-171
lines changed

14 files changed

+350
-171
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: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
/*
2+
Copyright 2024 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+
$Id: HumanReadableStreamDescriptionAtom.c,v 1.0 2026/03/05 17:00:48 erapefh Exp $
18+
*/
19+
20+
#include "MP4Atoms.h"
21+
#include <stdlib.h>
22+
23+
static void destroy(MP4AtomPtr s)
24+
{
25+
MP4HumanReadableStreamDescriptionAtomPtr self;
26+
self = (MP4HumanReadableStreamDescriptionAtomPtr)s;
27+
if(self == NULL) return;
28+
29+
if(self->description)
30+
{
31+
free(self->description);
32+
self->description = NULL;
33+
}
34+
35+
if(self->super) self->super->destroy(s);
36+
}
37+
38+
static MP4Err serialize(struct MP4Atom *s, char *buffer)
39+
{
40+
MP4Err err;
41+
MP4HumanReadableStreamDescriptionAtomPtr self = (MP4HumanReadableStreamDescriptionAtomPtr)s;
42+
err = MP4NoErr;
43+
44+
err = MP4SerializeCommonBaseAtomFields(s, buffer);
45+
if(err) goto bail;
46+
buffer += self->bytesWritten;
47+
assert(self->type == MP4HumanReadableStreamDescriptionAtomType);
48+
49+
/* Write description as null-terminated UTF-8 string */
50+
if(self->description != NULL)
51+
{
52+
u32 descLen = (u32)strlen(self->description) + 1; /* Include null terminator */
53+
PUTBYTES(self->description, descLen);
54+
}
55+
else
56+
{
57+
/* Empty description: just write '\0' */
58+
u8 nullByte = 0;
59+
PUT8_V(nullByte);
60+
}
61+
62+
assert(self->bytesWritten == self->size);
63+
bail:
64+
TEST_RETURN(err);
65+
66+
return err;
67+
}
68+
69+
static MP4Err calculateSize(struct MP4Atom *s)
70+
{
71+
MP4Err err;
72+
MP4HumanReadableStreamDescriptionAtomPtr self = (MP4HumanReadableStreamDescriptionAtomPtr)s;
73+
err = MP4NoErr;
74+
75+
err = MP4CalculateBaseAtomFieldSize(s);
76+
if(err) goto bail;
77+
/* Add description size (null-terminated string) */
78+
if(self->description != NULL)
79+
{
80+
self->size += (u32)strlen(self->description) + 1; /* Including '\0' */
81+
}
82+
else
83+
{
84+
self->size += 1; /* Just '\0' */
85+
}
86+
bail:
87+
TEST_RETURN(err);
88+
89+
return err;
90+
}
91+
92+
static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStreamPtr inputStream)
93+
{
94+
MP4Err err;
95+
MP4HumanReadableStreamDescriptionAtomPtr self = (MP4HumanReadableStreamDescriptionAtomPtr)s;
96+
s64 bytesToRead;
97+
u32 descLen;
98+
u32 i;
99+
100+
if(self == NULL) BAILWITHERROR(MP4BadParamErr)
101+
err = self->super->createFromInputStream(s, proto, (char *)inputStream);
102+
if(err) goto bail;
103+
104+
/* Calculate remaining bytes to read */
105+
bytesToRead = (s64)(self->size - self->bytesRead);
106+
if(bytesToRead < 0) BAILWITHERROR(MP4BadDataErr);
107+
108+
if(bytesToRead > 0)
109+
{
110+
/* Read description (null-terminated UTF-8 string) */
111+
/* First, scan for null terminator to find description length */
112+
descLen = 0;
113+
for(i = 0; i < (u32)bytesToRead; i++)
114+
{
115+
u8 byte;
116+
err = inputStream->read8(inputStream, (u32 *)&byte, NULL);
117+
if(err) goto bail;
118+
descLen++;
119+
self->bytesRead++;
120+
if(byte == 0) break;
121+
}
122+
123+
/* Allocate and read description - we need to re-read the bytes */
124+
/* Rewind by backing up bytesRead */
125+
self->bytesRead -= descLen;
126+
err = inputStream->rewindData(inputStream, descLen, NULL);
127+
128+
self->description = (char *)calloc(descLen, 1);
129+
TESTMALLOC(self->description);
130+
err = inputStream->readData(inputStream, descLen, (char *)self->description, NULL);
131+
if(err) goto bail;
132+
self->bytesRead += descLen;
133+
}
134+
135+
bail:
136+
TEST_RETURN(err);
137+
138+
return err;
139+
}
140+
141+
MP4Err
142+
MP4CreateHumanReadableStreamDescriptionAtom(MP4HumanReadableStreamDescriptionAtomPtr *outAtom)
143+
{
144+
MP4Err err;
145+
MP4HumanReadableStreamDescriptionAtomPtr self;
146+
147+
self = (MP4HumanReadableStreamDescriptionAtomPtr)calloc(
148+
1, sizeof(MP4HumanReadableStreamDescriptionAtom));
149+
TESTMALLOC(self);
150+
151+
err = MP4CreateBaseAtom((MP4AtomPtr)self);
152+
if(err) goto bail;
153+
self->type = MP4HumanReadableStreamDescriptionAtomType;
154+
self->name = "HumanReadableStreamDescription";
155+
self->createFromInputStream = (cisfunc)createFromInputStream;
156+
self->destroy = destroy;
157+
self->calculateSize = calculateSize;
158+
self->serialize = serialize;
159+
*outAtom = self;
160+
bail:
161+
TEST_RETURN(err);
162+
163+
return err;
164+
}

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)