Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
bfe559d0
Commit
bfe559d0
authored
Jul 29, 2009
by
ogg.k.ogg.k
Committed by
Jean-Baptiste Kempf
Jul 30, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add video streams' BOS packets first
Signed-off-by:
Jean-Baptiste Kempf
<
jb@videolan.org
>
parent
6f2d1380
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
77 additions
and
70 deletions
+77
-70
modules/mux/ogg.c
modules/mux/ogg.c
+77
-70
No files found.
modules/mux/ogg.c
View file @
bfe559d0
...
...
@@ -619,87 +619,94 @@ static block_t *OggCreateHeader( sout_mux_t *p_mux )
/* Write header for each stream. All b_o_s (beginning of stream) packets
* must appear first in the ogg stream so we take care of them first. */
for
(
i
=
0
;
i
<
p_mux
->
i_nb_inputs
;
i
++
)
for
(
i
nt
pass
=
0
;
pass
<
2
;
pass
++
)
{
sout_input_t
*
p_input
=
p_mux
->
pp_inputs
[
i
];
ogg_stream_t
*
p_stream
=
(
ogg_stream_t
*
)
p_input
->
p_sys
;
p_stream
->
b_new
=
false
;
for
(
i
=
0
;
i
<
p_mux
->
i_nb_inputs
;
i
++
)
{
sout_input_t
*
p_input
=
p_mux
->
pp_inputs
[
i
];
ogg_stream_t
*
p_stream
=
(
ogg_stream_t
*
)
p_input
->
p_sys
;
msg_Dbg
(
p_mux
,
"creating header for %4.4s"
,
(
char
*
)
&
p_stream
->
i_fourcc
);
bool
video
=
(
p_stream
->
i_fourcc
==
VLC_CODEC_THEORA
||
p_stream
->
i_fourcc
==
VLC_CODEC_DIRAC
);
if
(
(
(
pass
==
0
&&
!
video
)
||
(
pass
==
1
&&
video
)
)
)
continue
;
ogg_stream_init
(
&
p_stream
->
os
,
p_stream
->
i_serial_no
);
p_stream
->
i_packet_no
=
0
;
msg_Dbg
(
p_mux
,
"creating header for %4.4s"
,
(
char
*
)
&
p_stream
->
i_fourcc
)
;
if
(
p_stream
->
i_fourcc
==
VLC_CODEC_VORBIS
||
p_stream
->
i_fourcc
==
VLC_CODEC_SPEEX
||
p_stream
->
i_fourcc
==
VLC_CODEC_THEORA
)
{
/* First packet in order: vorbis/speex/theora info */
p_extra
=
p_input
->
p_fmt
->
p_extra
;
i_extra
=
p_input
->
p_fmt
->
i_extra
;
ogg_stream_init
(
&
p_stream
->
os
,
p_stream
->
i_serial_no
);
p_stream
->
b_new
=
false
;
p_stream
->
i_packet_no
=
0
;
op
.
bytes
=
*
(
p_extra
++
)
<<
8
;
op
.
bytes
|=
(
*
(
p_extra
++
)
&
0xFF
);
op
.
packet
=
p_extra
;
i_extra
-=
(
op
.
bytes
+
2
);
if
(
i_extra
<
0
)
if
(
p_stream
->
i_fourcc
==
VLC_CODEC_VORBIS
||
p_stream
->
i_fourcc
==
VLC_CODEC_SPEEX
||
p_stream
->
i_fourcc
==
VLC_CODEC_THEORA
)
{
msg_Err
(
p_mux
,
"header data corrupted"
);
op
.
bytes
+=
i
_extra
;
}
/* First packet in order: vorbis/speex/theora info */
p_extra
=
p_input
->
p_fmt
->
p
_extra
;
i_extra
=
p_input
->
p_fmt
->
i_extra
;
op
.
b_o_s
=
1
;
op
.
e_o_s
=
0
;
op
.
granulepos
=
0
;
op
.
packetno
=
p_stream
->
i_packet_no
++
;
ogg_stream_packetin
(
&
p_stream
->
os
,
&
op
);
p_og
=
OggStreamFlush
(
p_mux
,
&
p_stream
->
os
,
0
);
op
.
bytes
=
*
(
p_extra
++
)
<<
8
;
op
.
bytes
|=
(
*
(
p_extra
++
)
&
0xFF
);
op
.
packet
=
p_extra
;
i_extra
-=
(
op
.
bytes
+
2
);
if
(
i_extra
<
0
)
{
msg_Err
(
p_mux
,
"header data corrupted"
);
op
.
bytes
+=
i_extra
;
}
op
.
b_o_s
=
1
;
op
.
e_o_s
=
0
;
op
.
granulepos
=
0
;
op
.
packetno
=
p_stream
->
i_packet_no
++
;
ogg_stream_packetin
(
&
p_stream
->
os
,
&
op
);
p_og
=
OggStreamFlush
(
p_mux
,
&
p_stream
->
os
,
0
);
/* Get keyframe_granule_shift for theora granulepos calculation */
if
(
p_stream
->
i_fourcc
==
VLC_CODEC_THEORA
)
/* Get keyframe_granule_shift for theora granulepos calculation */
if
(
p_stream
->
i_fourcc
==
VLC_CODEC_THEORA
)
{
p_stream
->
i_keyframe_granule_shift
=
(
(
op
.
packet
[
40
]
&
0x03
)
<<
3
)
|
(
(
op
.
packet
[
41
]
&
0xe0
)
>>
5
);
}
}
else
if
(
p_stream
->
i_fourcc
==
VLC_CODEC_DIRAC
)
{
op
.
packet
=
p_input
->
p_fmt
->
p_extra
;
op
.
bytes
=
p_input
->
p_fmt
->
i_extra
;
op
.
b_o_s
=
1
;
op
.
e_o_s
=
0
;
op
.
granulepos
=
~
0
;
op
.
packetno
=
p_stream
->
i_packet_no
++
;
ogg_stream_packetin
(
&
p_stream
->
os
,
&
op
);
p_og
=
OggStreamFlush
(
p_mux
,
&
p_stream
->
os
,
0
);
}
else
if
(
p_stream
->
i_fourcc
==
VLC_CODEC_FLAC
)
{
p_stream
->
i_keyframe_granule_shift
=
(
(
op
.
packet
[
40
]
&
0x03
)
<<
3
)
|
(
(
op
.
packet
[
41
]
&
0xe0
)
>>
5
);
/* flac stream marker (yeah, only that in the 1st packet) */
op
.
packet
=
(
unsigned
char
*
)
"fLaC"
;
op
.
bytes
=
4
;
op
.
b_o_s
=
1
;
op
.
e_o_s
=
0
;
op
.
granulepos
=
0
;
op
.
packetno
=
p_stream
->
i_packet_no
++
;
ogg_stream_packetin
(
&
p_stream
->
os
,
&
op
);
p_og
=
OggStreamFlush
(
p_mux
,
&
p_stream
->
os
,
0
);
}
else
if
(
p_stream
->
p_oggds_header
)
{
/* ds header */
op
.
packet
=
(
uint8_t
*
)
p_stream
->
p_oggds_header
;
op
.
bytes
=
p_stream
->
p_oggds_header
->
i_size
+
1
;
op
.
b_o_s
=
1
;
op
.
e_o_s
=
0
;
op
.
granulepos
=
0
;
op
.
packetno
=
p_stream
->
i_packet_no
++
;
ogg_stream_packetin
(
&
p_stream
->
os
,
&
op
);
p_og
=
OggStreamFlush
(
p_mux
,
&
p_stream
->
os
,
0
);
}
}
else
if
(
p_stream
->
i_fourcc
==
VLC_CODEC_DIRAC
)
{
op
.
packet
=
p_input
->
p_fmt
->
p_extra
;
op
.
bytes
=
p_input
->
p_fmt
->
i_extra
;
op
.
b_o_s
=
1
;
op
.
e_o_s
=
0
;
op
.
granulepos
=
~
0
;
op
.
packetno
=
p_stream
->
i_packet_no
++
;
ogg_stream_packetin
(
&
p_stream
->
os
,
&
op
);
p_og
=
OggStreamFlush
(
p_mux
,
&
p_stream
->
os
,
0
);
}
else
if
(
p_stream
->
i_fourcc
==
VLC_CODEC_FLAC
)
{
/* flac stream marker (yeah, only that in the 1st packet) */
op
.
packet
=
(
unsigned
char
*
)
"fLaC"
;
op
.
bytes
=
4
;
op
.
b_o_s
=
1
;
op
.
e_o_s
=
0
;
op
.
granulepos
=
0
;
op
.
packetno
=
p_stream
->
i_packet_no
++
;
ogg_stream_packetin
(
&
p_stream
->
os
,
&
op
);
p_og
=
OggStreamFlush
(
p_mux
,
&
p_stream
->
os
,
0
);
}
else
if
(
p_stream
->
p_oggds_header
)
{
/* ds header */
op
.
packet
=
(
uint8_t
*
)
p_stream
->
p_oggds_header
;
op
.
bytes
=
p_stream
->
p_oggds_header
->
i_size
+
1
;
op
.
b_o_s
=
1
;
op
.
e_o_s
=
0
;
op
.
granulepos
=
0
;
op
.
packetno
=
p_stream
->
i_packet_no
++
;
ogg_stream_packetin
(
&
p_stream
->
os
,
&
op
);
p_og
=
OggStreamFlush
(
p_mux
,
&
p_stream
->
os
,
0
);
}
block_ChainAppend
(
&
p_hdr
,
p_og
);
block_ChainAppend
(
&
p_hdr
,
p_og
);
}
}
/* Take care of the non b_o_s headers */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment