Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Opus
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Xiph.Org
Opus
Commits
7eb3c2b7
Commit
7eb3c2b7
authored
17 years ago
by
conrad
Committed by
Jean-Marc Valin
17 years ago
Browse files
Options
Downloads
Patches
Plain Diff
skeleton endianness fixes
parent
0df0eb4c
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
tools/skeleton.c
+93
-25
93 additions, 25 deletions
tools/skeleton.c
with
93 additions
and
25 deletions
tools/skeleton.c
+
93
−
25
View file @
7eb3c2b7
...
...
@@ -3,6 +3,18 @@
* author: Tahseen Mohammad
*/
/* This file depends on WORDS_BIGENDIAN being defined to 1 if the host
* processor stores words with the most significant byte first (like Motorola
* and SPARC, unlike Intel and VAX).
* On little endian systems, WORDS_BIGENDIAN should be undefined.
*
* When using GNU Autotools, the correct value will be written into config.h
* if the autoconf macro AC_C_BIGENDIAN is called in configure.ac.
*/
#ifdef HAVE_CONFIG_H
#include
"config.h"
#endif
#include
<stdlib.h>
#include
<string.h>
#include
<stdio.h>
...
...
@@ -11,6 +23,62 @@
#include
"skeleton.h"
#ifdef WIN32
#define snprintf _snprintf
#endif
static
unsigned
short
_le_16
(
unsigned
short
s
)
{
unsigned
short
ret
=
s
;
#ifdef WORDS_BIGENDIAN
ret
=
(
s
>>
8
)
&
0x00ffU
;
ret
+=
(
s
<<
8
)
&
0xff00U
;
#endif
return
ret
;
}
static
ogg_uint32_t
_le_32
(
ogg_uint32_t
i
)
{
ogg_uint32_t
ret
=
i
;
#ifdef WORDS_BIGENDIAN
ret
=
(
i
>>
24
);
ret
+=
(
i
>>
8
)
&
0x0000ff00
;
ret
+=
(
i
<<
8
)
&
0x00ff0000
;
ret
+=
(
i
<<
24
);
#endif
return
ret
;
}
static
ogg_int64_t
_le_64
(
ogg_int64_t
l
)
{
ogg_int64_t
ret
=
l
;
unsigned
char
*
ucptr
=
(
unsigned
char
*
)
&
ret
;
#ifdef WORDS_BIGENDIAN
unsigned
char
temp
;
temp
=
ucptr
[
0
]
;
ucptr
[
0
]
=
ucptr
[
7
]
;
ucptr
[
7
]
=
temp
;
temp
=
ucptr
[
1
]
;
ucptr
[
1
]
=
ucptr
[
6
]
;
ucptr
[
6
]
=
temp
;
temp
=
ucptr
[
2
]
;
ucptr
[
2
]
=
ucptr
[
5
]
;
ucptr
[
5
]
=
temp
;
temp
=
ucptr
[
3
]
;
ucptr
[
3
]
=
ucptr
[
4
]
;
ucptr
[
4
]
=
temp
;
#endif
return
(
*
(
ogg_int64_t
*
)
ucptr
);
}
/* write an ogg_page to a file pointer */
int
write_ogg_page_to_file
(
ogg_page
*
og
,
FILE
*
out
)
{
int
written
;
...
...
@@ -53,12 +121,12 @@ ogg_packet ogg_from_fishead(fishead_packet *fp) {
memset
(
op
.
packet
,
0
,
FISHEAD_SIZE
);
memcpy
(
op
.
packet
,
FISHEAD_IDENTIFIER
,
8
);
/* identifier */
*
((
ogg_uint16_t
*
)(
op
.
packet
+
8
))
=
SKELETON_VERSION_MAJOR
;
/* version major */
*
((
ogg_uint16_t
*
)(
op
.
packet
+
10
))
=
SKELETON_VERSION_MINOR
;
/* version minor */
*
((
ogg_int64_t
*
)(
op
.
packet
+
12
))
=
(
ogg_int64_t
)
fp
->
ptime_n
;
/* presentationtime numerator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
20
))
=
(
ogg_int64_t
)
fp
->
ptime_d
;
/* presentationtime denominator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
28
))
=
(
ogg_int64_t
)
fp
->
btime_n
;
/* basetime numerator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
36
))
=
(
ogg_int64_t
)
fp
->
btime_d
;
/* basetime denominator */
*
((
ogg_uint16_t
*
)(
op
.
packet
+
8
))
=
_le_16
(
SKELETON_VERSION_MAJOR
)
;
/* version major */
*
((
ogg_uint16_t
*
)(
op
.
packet
+
10
))
=
_le_16
(
SKELETON_VERSION_MINOR
)
;
/* version minor */
*
((
ogg_int64_t
*
)(
op
.
packet
+
12
))
=
_le_64
(
fp
->
ptime_n
)
;
/* presentationtime numerator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
20
))
=
_le_64
(
fp
->
ptime_d
)
;
/* presentationtime denominator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
28
))
=
_le_64
(
fp
->
btime_n
)
;
/* basetime numerator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
36
))
=
_le_64
(
fp
->
btime_d
)
;
/* basetime denominator */
/* TODO: UTC time, set to zero for now */
op
.
b_o_s
=
1
;
/* its the first packet of the stream */
...
...
@@ -81,13 +149,13 @@ ogg_packet ogg_from_fisbone(fisbone_packet *fp) {
op
.
packet
=
_ogg_calloc
(
packet_size
,
sizeof
(
unsigned
char
));
memset
(
op
.
packet
,
0
,
packet_size
);
memcpy
(
op
.
packet
,
FISBONE_IDENTIFIER
,
8
);
/* identifier */
*
((
ogg_uint32_t
*
)(
op
.
packet
+
8
))
=
FISBONE_MESSAGE_HEADER_OFFSET
;
/* offset of the message header fields */
*
((
ogg_uint32_t
*
)(
op
.
packet
+
12
))
=
fp
->
serial_no
;
/* serialno of the respective stream */
*
((
ogg_uint32_t
*
)(
op
.
packet
+
16
))
=
fp
->
nr_header_packet
;
/* number of header packets */
*
((
ogg_int64_t
*
)(
op
.
packet
+
20
))
=
fp
->
granule_rate_n
;
/* granulrate numerator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
28
))
=
fp
->
granule_rate_d
;
/* granulrate denominator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
36
))
=
fp
->
start_granule
;
/* start granule */
*
((
ogg_uint32_t
*
)(
op
.
packet
+
44
))
=
fp
->
preroll
;
/* preroll, for theora its 0 */
*
((
ogg_uint32_t
*
)(
op
.
packet
+
8
))
=
_le_32
(
FISBONE_MESSAGE_HEADER_OFFSET
)
;
/* offset of the message header fields */
*
((
ogg_uint32_t
*
)(
op
.
packet
+
12
))
=
_le_32
(
fp
->
serial_no
)
;
/* serialno of the respective stream */
*
((
ogg_uint32_t
*
)(
op
.
packet
+
16
))
=
_le_32
(
fp
->
nr_header_packet
)
;
/* number of header packets */
*
((
ogg_int64_t
*
)(
op
.
packet
+
20
))
=
_le_64
(
fp
->
granule_rate_n
)
;
/* granulrate numerator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
28
))
=
_le_64
(
fp
->
granule_rate_d
)
;
/* granulrate denominator */
*
((
ogg_int64_t
*
)(
op
.
packet
+
36
))
=
_le_64
(
fp
->
start_granule
)
;
/* start granule */
*
((
ogg_uint32_t
*
)(
op
.
packet
+
44
))
=
_le_32
(
fp
->
preroll
)
;
/* preroll, for theora its 0 */
*
(
op
.
packet
+
48
)
=
fp
->
granule_shift
;
/* granule shift */
memcpy
((
op
.
packet
+
FISBONE_SIZE
),
fp
->
message_header_fields
,
fp
->
current_header_size
);
...
...
@@ -106,12 +174,12 @@ fishead_packet fishead_from_ogg(ogg_packet *op) {
if
(
memcmp
(
op
->
packet
,
FISHEAD_IDENTIFIER
,
8
))
;
/* invalid packet what do we do? */
fp
.
version_major
=
*
((
ogg_uint16_t
*
)(
op
->
packet
+
8
));
/* version major */
fp
.
version_minor
=
*
((
ogg_uint16_t
*
)(
op
->
packet
+
10
));
/* version minor */
fp
.
ptime_n
=
*
((
ogg_int64_t
*
)(
op
->
packet
+
12
));
/* presentationtime numerator */
fp
.
ptime_d
=
*
((
ogg_int64_t
*
)(
op
->
packet
+
20
));
/* presentationtime denominator */
fp
.
btime_n
=
*
((
ogg_int64_t
*
)(
op
->
packet
+
28
));
/* basetime numerator */
fp
.
btime_d
=
*
((
ogg_int64_t
*
)(
op
->
packet
+
36
));
/* basetime denominator */
fp
.
version_major
=
_le_16
(
*
((
ogg_uint16_t
*
)(
op
->
packet
+
8
))
)
;
/* version major */
fp
.
version_minor
=
_le_16
(
*
((
ogg_uint16_t
*
)(
op
->
packet
+
10
))
)
;
/* version minor */
fp
.
ptime_n
=
_le_64
(
*
((
ogg_int64_t
*
)(
op
->
packet
+
12
))
)
;
/* presentationtime numerator */
fp
.
ptime_d
=
_le_64
(
*
((
ogg_int64_t
*
)(
op
->
packet
+
20
))
)
;
/* presentationtime denominator */
fp
.
btime_n
=
_le_64
(
*
((
ogg_int64_t
*
)(
op
->
packet
+
28
))
)
;
/* basetime numerator */
fp
.
btime_d
=
_le_64
(
*
((
ogg_int64_t
*
)(
op
->
packet
+
36
))
)
;
/* basetime denominator */
memcpy
(
fp
.
UTC
,
op
->
packet
+
44
,
20
);
return
fp
;
...
...
@@ -124,12 +192,12 @@ fisbone_packet fisbone_from_ogg(ogg_packet *op) {
if
(
memcmp
(
op
->
packet
,
FISBONE_IDENTIFIER
,
8
))
;
/* invalid value, what do we do? */
fp
.
serial_no
=
*
((
ogg_uint32_t
*
)(
op
->
packet
+
12
));
/* serialno of the stream represented by this fisbone packet */
fp
.
nr_header_packet
=
*
((
ogg_uint32_t
*
)(
op
->
packet
+
16
));
/* number of header packets */
fp
.
granule_rate_n
=
*
((
ogg_int64_t
*
)(
op
->
packet
+
20
));
/* granulrate numerator */
fp
.
granule_rate_d
=
*
((
ogg_int64_t
*
)(
op
->
packet
+
28
));
/* granulrate denominator */
fp
.
start_granule
=
*
((
ogg_int64_t
*
)(
op
->
packet
+
36
));
/* start granule */
fp
.
preroll
=
*
((
ogg_uint32_t
*
)(
op
->
packet
+
44
));
/* preroll, for theora its 0 */
fp
.
serial_no
=
_le_32
(
*
((
ogg_uint32_t
*
)(
op
->
packet
+
12
))
)
;
/* serialno of the stream represented by this fisbone packet */
fp
.
nr_header_packet
=
_le_32
(
*
((
ogg_uint32_t
*
)(
op
->
packet
+
16
))
)
;
/* number of header packets */
fp
.
granule_rate_n
=
_le_64
(
*
((
ogg_int64_t
*
)(
op
->
packet
+
20
))
)
;
/* granulrate numerator */
fp
.
granule_rate_d
=
_le_64
(
*
((
ogg_int64_t
*
)(
op
->
packet
+
28
))
)
;
/* granulrate denominator */
fp
.
start_granule
=
_le_64
(
*
((
ogg_int64_t
*
)(
op
->
packet
+
36
))
)
;
/* start granule */
fp
.
preroll
=
_le_32
(
*
((
ogg_uint32_t
*
)(
op
->
packet
+
44
))
)
;
/* preroll, for theora its 0 */
fp
.
granule_shift
=
*
(
op
->
packet
+
48
);
/* granule shift */
fp
.
current_header_size
=
op
->
bytes
-
FISBONE_SIZE
;
fp
.
message_header_fields
=
_ogg_calloc
(
fp
.
current_header_size
+
1
,
sizeof
(
char
));
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment