Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
Commits
058b1732
Commit
058b1732
authored
Nov 15, 2013
by
Rafaël Carré
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
flac packetizer: cosmetics
C99, brace style, space No functional changes
parent
75b67dbc
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
141 additions
and
194 deletions
+141
-194
modules/packetizer/flac.c
modules/packetizer/flac.c
+141
-194
No files found.
modules/packetizer/flac.c
View file @
058b1732
...
@@ -41,15 +41,15 @@
...
@@ -41,15 +41,15 @@
/*****************************************************************************
/*****************************************************************************
* Module descriptor
* Module descriptor
*****************************************************************************/
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
vlc_module_begin
()
vlc_module_begin
()
set_category
(
CAT_SOUT
)
set_category
(
CAT_SOUT
)
set_subcategory
(
SUBCAT_SOUT_PACKETIZER
)
set_subcategory
(
SUBCAT_SOUT_PACKETIZER
)
set_description
(
N_
(
"Flac audio packetizer"
)
)
set_description
(
N_
(
"Flac audio packetizer"
)
)
set_capability
(
"packetizer"
,
50
)
set_capability
(
"packetizer"
,
50
)
set_callbacks
(
Open
,
Close
)
set_callbacks
(
Open
,
Close
)
vlc_module_end
()
vlc_module_end
()
/*****************************************************************************
/*****************************************************************************
...
@@ -114,35 +114,35 @@ static const int pi_channels_maps[9] =
...
@@ -114,35 +114,35 @@ static const int pi_channels_maps[9] =
/*****************************************************************************
/*****************************************************************************
* Local prototypes
* Local prototypes
*****************************************************************************/
*****************************************************************************/
static
block_t
*
Packetize
(
decoder_t
*
,
block_t
**
);
static
block_t
*
Packetize
(
decoder_t
*
,
block_t
**
);
static
int
SyncInfo
(
decoder_t
*
,
uint8_t
*
,
unsigned
int
*
,
static
int
SyncInfo
(
decoder_t
*
,
uint8_t
*
,
unsigned
int
*
,
unsigned
int
*
,
unsigned
int
*
);
unsigned
int
*
,
unsigned
int
*
);
static
uint64_t
read_utf8
(
const
uint8_t
*
p_buf
,
int
*
pi_read
);
static
uint64_t
read_utf8
(
const
uint8_t
*
p_buf
,
int
*
pi_read
);
static
uint8_t
flac_crc8
(
const
uint8_t
*
data
,
unsigned
len
);
static
uint8_t
flac_crc8
(
const
uint8_t
*
data
,
unsigned
len
);
static
int
Open
(
vlc_object_t
*
p_this
)
static
int
Open
(
vlc_object_t
*
p_this
)
{
{
decoder_t
*
p_dec
=
(
decoder_t
*
)
p_this
;
decoder_t
*
p_dec
=
(
decoder_t
*
)
p_this
;
decoder_sys_t
*
p_sys
;
decoder_sys_t
*
p_sys
;
if
(
p_dec
->
fmt_in
.
i_codec
!=
VLC_CODEC_FLAC
)
if
(
p_dec
->
fmt_in
.
i_codec
!=
VLC_CODEC_FLAC
)
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
/* */
/* */
p_dec
->
p_sys
=
p_sys
=
malloc
(
sizeof
(
*
p_sys
));
p_dec
->
p_sys
=
p_sys
=
malloc
(
sizeof
(
*
p_sys
));
if
(
!
p_sys
)
if
(
!
p_sys
)
return
VLC_ENOMEM
;
return
VLC_ENOMEM
;
date_Set
(
&
p_sys
->
end_date
,
0
);
date_Set
(
&
p_sys
->
end_date
,
0
);
p_sys
->
i_state
=
STATE_NOSYNC
;
p_sys
->
i_state
=
STATE_NOSYNC
;
p_sys
->
b_stream_info
=
false
;
p_sys
->
b_stream_info
=
false
;
p_sys
->
i_pts
=
VLC_TS_INVALID
;
p_sys
->
i_pts
=
VLC_TS_INVALID
;
block_BytestreamInit
(
&
p_sys
->
bytestream
);
block_BytestreamInit
(
&
p_sys
->
bytestream
);
/* */
/* */
es_format_Copy
(
&
p_dec
->
fmt_out
,
&
p_dec
->
fmt_in
);
es_format_Copy
(
&
p_dec
->
fmt_out
,
&
p_dec
->
fmt_in
);
p_dec
->
fmt_out
.
i_cat
=
AUDIO_ES
;
p_dec
->
fmt_out
.
i_cat
=
AUDIO_ES
;
p_dec
->
fmt_out
.
i_codec
=
VLC_CODEC_FLAC
;
p_dec
->
fmt_out
.
i_codec
=
VLC_CODEC_FLAC
;
...
@@ -153,19 +153,19 @@ static int Open( vlc_object_t *p_this )
...
@@ -153,19 +153,19 @@ static int Open( vlc_object_t *p_this )
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
static
void
Close
(
vlc_object_t
*
p_this
)
static
void
Close
(
vlc_object_t
*
p_this
)
{
{
decoder_t
*
p_dec
=
(
decoder_t
*
)
p_this
;
decoder_t
*
p_dec
=
(
decoder_t
*
)
p_this
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
block_BytestreamRelease
(
&
p_sys
->
bytestream
);
block_BytestreamRelease
(
&
p_sys
->
bytestream
);
free
(
p_sys
);
free
(
p_sys
);
}
}
/*****************************************************************************
/*****************************************************************************
* ProcessHeader: process Flac header.
* ProcessHeader: process Flac header.
*****************************************************************************/
*****************************************************************************/
static
void
ProcessHeader
(
decoder_t
*
p_dec
)
static
void
ProcessHeader
(
decoder_t
*
p_dec
)
{
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
...
@@ -178,134 +178,115 @@ static void ProcessHeader( decoder_t *p_dec )
...
@@ -178,134 +178,115 @@ static void ProcessHeader( decoder_t *p_dec )
p_extra
+=
8
;
p_extra
+=
8
;
}
}
if
(
p_dec
->
fmt_in
.
i_extra
<
14
)
if
(
p_dec
->
fmt_in
.
i_extra
<
14
)
return
;
return
;
bs_init
(
&
bs
,
p_extra
,
i_extra
);
bs_init
(
&
bs
,
p_extra
,
i_extra
);
p_sys
->
stream_info
.
min_blocksize
=
bs_read
(
&
bs
,
16
);
p_sys
->
stream_info
.
min_blocksize
=
bs_read
(
&
bs
,
16
);
p_sys
->
stream_info
.
max_blocksize
=
bs_read
(
&
bs
,
16
);
p_sys
->
stream_info
.
max_blocksize
=
bs_read
(
&
bs
,
16
);
p_sys
->
stream_info
.
min_framesize
=
bs_read
(
&
bs
,
24
);
p_sys
->
stream_info
.
min_framesize
=
bs_read
(
&
bs
,
24
);
p_sys
->
stream_info
.
max_framesize
=
bs_read
(
&
bs
,
24
);
p_sys
->
stream_info
.
max_framesize
=
bs_read
(
&
bs
,
24
);
p_sys
->
stream_info
.
sample_rate
=
bs_read
(
&
bs
,
20
);
p_sys
->
stream_info
.
sample_rate
=
bs_read
(
&
bs
,
20
);
p_sys
->
stream_info
.
channels
=
bs_read
(
&
bs
,
3
)
+
1
;
p_sys
->
stream_info
.
channels
=
bs_read
(
&
bs
,
3
)
+
1
;
p_sys
->
stream_info
.
bits_per_sample
=
bs_read
(
&
bs
,
5
)
+
1
;
p_sys
->
stream_info
.
bits_per_sample
=
bs_read
(
&
bs
,
5
)
+
1
;
p_sys
->
b_stream_info
=
true
;
p_sys
->
b_stream_info
=
true
;
p_dec
->
fmt_out
.
i_extra
=
i_extra
;
p_dec
->
fmt_out
.
i_extra
=
i_extra
;
p_dec
->
fmt_out
.
p_extra
=
xrealloc
(
p_dec
->
fmt_out
.
p_extra
,
i_extra
);
p_dec
->
fmt_out
.
p_extra
=
xrealloc
(
p_dec
->
fmt_out
.
p_extra
,
i_extra
);
memcpy
(
p_dec
->
fmt_out
.
p_extra
,
p_extra
,
i_extra
);
memcpy
(
p_dec
->
fmt_out
.
p_extra
,
p_extra
,
i_extra
);
}
}
/* */
/* */
static
block_t
*
Packetize
(
decoder_t
*
p_dec
,
block_t
**
pp_block
)
static
block_t
*
Packetize
(
decoder_t
*
p_dec
,
block_t
**
pp_block
)
{
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
uint8_t
p_header
[
MAX_FLAC_HEADER_SIZE
];
uint8_t
p_header
[
MAX_FLAC_HEADER_SIZE
];
block_t
*
p_sout_block
;
block_t
*
p_sout_block
;
if
(
!
pp_block
||
!*
pp_block
)
return
NULL
;
if
(
!
pp_block
||
!*
pp_block
)
return
NULL
;
if
(
(
*
pp_block
)
->
i_flags
&
(
BLOCK_FLAG_DISCONTINUITY
|
BLOCK_FLAG_CORRUPTED
)
)
if
((
*
pp_block
)
->
i_flags
&
(
BLOCK_FLAG_DISCONTINUITY
|
BLOCK_FLAG_CORRUPTED
))
{
{
if
((
*
pp_block
)
->
i_flags
&
BLOCK_FLAG_CORRUPTED
)
{
if
(
(
*
pp_block
)
->
i_flags
&
BLOCK_FLAG_CORRUPTED
)
{
p_sys
->
i_state
=
STATE_NOSYNC
;
p_sys
->
i_state
=
STATE_NOSYNC
;
block_BytestreamEmpty
(
&
p_sys
->
bytestream
);
block_BytestreamEmpty
(
&
p_sys
->
bytestream
);
}
}
date_Set
(
&
p_sys
->
end_date
,
0
);
date_Set
(
&
p_sys
->
end_date
,
0
);
block_Release
(
*
pp_block
);
block_Release
(
*
pp_block
);
return
NULL
;
return
NULL
;
}
}
if
(
!
p_sys
->
b_stream_info
)
if
(
!
p_sys
->
b_stream_info
)
ProcessHeader
(
p_dec
);
ProcessHeader
(
p_dec
);
if
(
p_sys
->
stream_info
.
channels
>
8
)
if
(
p_sys
->
stream_info
.
channels
>
8
)
{
{
msg_Err
(
p_dec
,
"This stream uses too many audio channels"
);
msg_Err
(
p_dec
,
"This stream uses too many audio channels"
);
return
NULL
;
return
NULL
;
}
}
if
(
!
date_Get
(
&
p_sys
->
end_date
)
&&
(
*
pp_block
)
->
i_pts
<=
VLC_TS_INVALID
)
if
(
!
date_Get
(
&
p_sys
->
end_date
)
&&
(
*
pp_block
)
->
i_pts
<=
VLC_TS_INVALID
)
{
{
/* We've just started the stream, wait for the first PTS. */
/* We've just started the stream, wait for the first PTS. */
block_Release
(
*
pp_block
);
block_Release
(
*
pp_block
);
return
NULL
;
return
NULL
;
}
}
else
if
(
!
date_Get
(
&
p_sys
->
end_date
))
{
else
if
(
!
date_Get
(
&
p_sys
->
end_date
)
)
{
/* The first PTS is as good as anything else. */
/* The first PTS is as good as anything else. */
p_sys
->
i_rate
=
p_dec
->
fmt_out
.
audio
.
i_rate
;
p_sys
->
i_rate
=
p_dec
->
fmt_out
.
audio
.
i_rate
;
date_Init
(
&
p_sys
->
end_date
,
p_sys
->
i_rate
,
1
);
date_Init
(
&
p_sys
->
end_date
,
p_sys
->
i_rate
,
1
);
date_Set
(
&
p_sys
->
end_date
,
(
*
pp_block
)
->
i_pts
);
date_Set
(
&
p_sys
->
end_date
,
(
*
pp_block
)
->
i_pts
);
}
}
block_BytestreamPush
(
&
p_sys
->
bytestream
,
*
pp_block
);
block_BytestreamPush
(
&
p_sys
->
bytestream
,
*
pp_block
);
while
(
1
)
while
(
1
)
{
{
switch
(
p_sys
->
i_state
)
{
switch
(
p_sys
->
i_state
)
{
case
STATE_NOSYNC
:
case
STATE_NOSYNC
:
while
(
block_PeekBytes
(
&
p_sys
->
bytestream
,
p_header
,
2
)
while
(
block_PeekBytes
(
&
p_sys
->
bytestream
,
p_header
,
2
)
==
VLC_SUCCESS
)
==
VLC_SUCCESS
)
{
{
if
(
p_header
[
0
]
==
0xFF
&&
(
p_header
[
1
]
&
0xFE
)
==
0xF8
)
{
if
(
p_header
[
0
]
==
0xFF
&&
(
p_header
[
1
]
&
0xFE
)
==
0xF8
)
{
p_sys
->
i_state
=
STATE_SYNC
;
p_sys
->
i_state
=
STATE_SYNC
;
break
;
break
;
}
}
block_SkipByte
(
&
p_sys
->
bytestream
);
block_SkipByte
(
&
p_sys
->
bytestream
);
}
}
if
(
p_sys
->
i_state
!=
STATE_SYNC
)
if
(
p_sys
->
i_state
!=
STATE_SYNC
)
{
{
block_BytestreamFlush
(
&
p_sys
->
bytestream
);
block_BytestreamFlush
(
&
p_sys
->
bytestream
);
return
NULL
;
/* Need more data */
/* Need more data */
return
NULL
;
}
}
case
STATE_SYNC
:
case
STATE_SYNC
:
/* New frame, set the Presentation Time Stamp */
/* New frame, set the Presentation Time Stamp */
p_sys
->
i_pts
=
p_sys
->
bytestream
.
p_block
->
i_pts
;
p_sys
->
i_pts
=
p_sys
->
bytestream
.
p_block
->
i_pts
;
if
(
p_sys
->
i_pts
>
VLC_TS_INVALID
&&
if
(
p_sys
->
i_pts
>
VLC_TS_INVALID
&&
p_sys
->
i_pts
!=
date_Get
(
&
p_sys
->
end_date
)
)
p_sys
->
i_pts
!=
date_Get
(
&
p_sys
->
end_date
))
{
date_Set
(
&
p_sys
->
end_date
,
p_sys
->
i_pts
);
date_Set
(
&
p_sys
->
end_date
,
p_sys
->
i_pts
);
}
p_sys
->
i_state
=
STATE_HEADER
;
p_sys
->
i_state
=
STATE_HEADER
;
case
STATE_HEADER
:
case
STATE_HEADER
:
/* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
/* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
if
(
block_PeekBytes
(
&
p_sys
->
bytestream
,
p_header
,
if
(
block_PeekBytes
(
&
p_sys
->
bytestream
,
p_header
,
MAX_FLAC_HEADER_SIZE
)
!=
VLC_SUCCESS
)
MAX_FLAC_HEADER_SIZE
)
!=
VLC_SUCCESS
)
{
return
NULL
;
/* Need more data */
/* Need more data */
return
NULL
;
}
/* Check if frame is valid and get frame info */
/* Check if frame is valid and get frame info */
p_sys
->
i_frame_length
=
SyncInfo
(
p_dec
,
p_header
,
p_sys
->
i_frame_length
=
SyncInfo
(
p_dec
,
p_header
,
&
p_sys
->
i_channels
,
&
p_sys
->
i_channels
,
&
p_sys
->
i_rate
,
&
p_sys
->
i_rate
,
&
p_sys
->
i_bits_per_sample
);
&
p_sys
->
i_bits_per_sample
);
if
(
!
p_sys
->
i_frame_length
)
if
(
!
p_sys
->
i_frame_length
)
{
{
msg_Dbg
(
p_dec
,
"emulated sync word"
);
msg_Dbg
(
p_dec
,
"emulated sync word"
);
block_SkipByte
(
&
p_sys
->
bytestream
);
block_SkipByte
(
&
p_sys
->
bytestream
);
p_sys
->
i_state
=
STATE_NOSYNC
;
p_sys
->
i_state
=
STATE_NOSYNC
;
break
;
break
;
}
}
if
(
p_sys
->
i_rate
!=
p_dec
->
fmt_out
.
audio
.
i_rate
)
if
(
p_sys
->
i_rate
!=
p_dec
->
fmt_out
.
audio
.
i_rate
)
{
{
p_dec
->
fmt_out
.
audio
.
i_rate
=
p_sys
->
i_rate
;
p_dec
->
fmt_out
.
audio
.
i_rate
=
p_sys
->
i_rate
;
const
mtime_t
i_end_date
=
date_Get
(
&
p_sys
->
end_date
);
const
mtime_t
i_end_date
=
date_Get
(
&
p_sys
->
end_date
);
date_Init
(
&
p_sys
->
end_date
,
p_sys
->
i_rate
,
1
);
date_Init
(
&
p_sys
->
end_date
,
p_sys
->
i_rate
,
1
);
date_Set
(
&
p_sys
->
end_date
,
i_end_date
);
date_Set
(
&
p_sys
->
end_date
,
i_end_date
);
}
}
p_sys
->
i_state
=
STATE_NEXT_SYNC
;
p_sys
->
i_state
=
STATE_NEXT_SYNC
;
p_sys
->
i_frame_size
=
p_sys
->
b_stream_info
&&
p_sys
->
stream_info
.
min_framesize
>
0
?
p_sys
->
i_frame_size
=
p_sys
->
b_stream_info
&&
p_sys
->
stream_info
.
min_framesize
>
0
?
...
@@ -316,22 +297,19 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
...
@@ -316,22 +297,19 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
* next sync word */
* next sync word */
/* Check if next expected frame contains the sync word */
/* Check if next expected frame contains the sync word */
while
(
block_PeekOffsetBytes
(
&
p_sys
->
bytestream
,
while
(
block_PeekOffsetBytes
(
&
p_sys
->
bytestream
,
p_sys
->
i_frame_size
,
p_header
,
p_sys
->
i_frame_size
,
p_header
,
MAX_FLAC_HEADER_SIZE
)
MAX_FLAC_HEADER_SIZE
)
==
VLC_SUCCESS
)
==
VLC_SUCCESS
)
{
{
if
(
p_header
[
0
]
==
0xFF
&&
(
p_header
[
1
]
&
0xFE
)
==
0xF8
)
{
if
(
p_header
[
0
]
==
0xFF
&&
(
p_header
[
1
]
&
0xFE
)
==
0xF8
)
{
/* Check if frame is valid and get frame info */
/* Check if frame is valid and get frame info */
int
i_frame_length
=
int
i_frame_length
=
SyncInfo
(
p_dec
,
p_header
,
SyncInfo
(
p_dec
,
p_header
,
&
p_sys
->
i_channels
,
&
p_sys
->
i_channels
,
&
p_sys
->
i_rate
,
&
p_sys
->
i_rate
,
&
p_sys
->
i_bits_per_sample
);
&
p_sys
->
i_bits_per_sample
);
if
(
i_frame_length
)
if
(
i_frame_length
)
{
{
p_sys
->
i_state
=
STATE_SEND_DATA
;
p_sys
->
i_state
=
STATE_SEND_DATA
;
break
;
break
;
}
}
...
@@ -339,12 +317,10 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
...
@@ -339,12 +317,10 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
p_sys
->
i_frame_size
++
;
p_sys
->
i_frame_size
++
;
}
}
if
(
p_sys
->
i_state
!=
STATE_SEND_DATA
)
if
(
p_sys
->
i_state
!=
STATE_SEND_DATA
)
{
{
if
(
p_sys
->
b_stream_info
&&
p_sys
->
stream_info
.
max_framesize
>
0
&&
if
(
p_sys
->
b_stream_info
&&
p_sys
->
stream_info
.
max_framesize
>
0
&&
p_sys
->
i_frame_size
>
p_sys
->
stream_info
.
max_framesize
)
{
p_sys
->
i_frame_size
>
p_sys
->
stream_info
.
max_framesize
)
block_SkipByte
(
&
p_sys
->
bytestream
);
{
block_SkipByte
(
&
p_sys
->
bytestream
);
p_sys
->
i_state
=
STATE_NOSYNC
;
p_sys
->
i_state
=
STATE_NOSYNC
;
return
NULL
;
return
NULL
;
}
}
...
@@ -353,15 +329,15 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
...
@@ -353,15 +329,15 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
}
}
case
STATE_SEND_DATA
:
case
STATE_SEND_DATA
:
p_sout_block
=
block_Alloc
(
p_sys
->
i_frame_size
);
p_sout_block
=
block_Alloc
(
p_sys
->
i_frame_size
);
/* Copy the whole frame into the buffer. When we reach this point
/* Copy the whole frame into the buffer. When we reach this point
* we already know we have enough data available. */
* we already know we have enough data available. */
block_GetBytes
(
&
p_sys
->
bytestream
,
p_sout_block
->
p_buffer
,
block_GetBytes
(
&
p_sys
->
bytestream
,
p_sout_block
->
p_buffer
,
p_sys
->
i_frame_size
);
p_sys
->
i_frame_size
);
/* Make sure we don't reuse the same pts twice */
/* Make sure we don't reuse the same pts twice */
if
(
p_sys
->
i_pts
==
p_sys
->
bytestream
.
p_block
->
i_pts
)
if
(
p_sys
->
i_pts
==
p_sys
->
bytestream
.
p_block
->
i_pts
)
p_sys
->
i_pts
=
p_sys
->
bytestream
.
p_block
->
i_pts
=
VLC_TS_INVALID
;
p_sys
->
i_pts
=
p_sys
->
bytestream
.
p_block
->
i_pts
=
VLC_TS_INVALID
;
p_dec
->
fmt_out
.
audio
.
i_channels
=
p_sys
->
i_channels
;
p_dec
->
fmt_out
.
audio
.
i_channels
=
p_sys
->
i_channels
;
...
@@ -370,16 +346,16 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
...
@@ -370,16 +346,16 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
pi_channels_maps
[
p_sys
->
stream_info
.
channels
];
pi_channels_maps
[
p_sys
->
stream_info
.
channels
];
/* So p_block doesn't get re-added several times */
/* So p_block doesn't get re-added several times */
*
pp_block
=
block_BytestreamPop
(
&
p_sys
->
bytestream
);
*
pp_block
=
block_BytestreamPop
(
&
p_sys
->
bytestream
);
p_sys
->
i_state
=
STATE_NOSYNC
;
p_sys
->
i_state
=
STATE_NOSYNC
;
/* Date management */
/* Date management */
p_sout_block
->
i_pts
=
p_sout_block
->
i_pts
=
p_sout_block
->
i_dts
=
date_Get
(
&
p_sys
->
end_date
);
p_sout_block
->
i_dts
=
date_Get
(
&
p_sys
->
end_date
);
date_Increment
(
&
p_sys
->
end_date
,
p_sys
->
i_frame_length
);
date_Increment
(
&
p_sys
->
end_date
,
p_sys
->
i_frame_length
);
p_sout_block
->
i_length
=
p_sout_block
->
i_length
=
date_Get
(
&
p_sys
->
end_date
)
-
p_sout_block
->
i_pts
;
date_Get
(
&
p_sys
->
end_date
)
-
p_sout_block
->
i_pts
;
return
p_sout_block
;
return
p_sout_block
;
}
}
...
@@ -391,10 +367,10 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
...
@@ -391,10 +367,10 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
/*****************************************************************************
/*****************************************************************************
* SyncInfo: parse FLAC sync info
* SyncInfo: parse FLAC sync info
*****************************************************************************/
*****************************************************************************/
static
int
SyncInfo
(
decoder_t
*
p_dec
,
uint8_t
*
p_buf
,
static
int
SyncInfo
(
decoder_t
*
p_dec
,
uint8_t
*
p_buf
,
unsigned
int
*
pi_channels
,
unsigned
int
*
pi_channels
,
unsigned
int
*
pi_sample_rate
,
unsigned
int
*
pi_sample_rate
,
unsigned
int
*
pi_bits_per_sample
)
unsigned
int
*
pi_bits_per_sample
)
{
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
int
i_header
,
i_temp
,
i_read
;
int
i_header
,
i_temp
,
i_read
;
...
@@ -402,17 +378,18 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
...
@@ -402,17 +378,18 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
int
i_blocksize_hint
=
0
,
i_sample_rate_hint
=
0
;
int
i_blocksize_hint
=
0
,
i_sample_rate_hint
=
0
;
/* Check syncword */
/* Check syncword */
if
(
p_buf
[
0
]
!=
0xFF
||
(
p_buf
[
1
]
&
0xFE
)
!=
0xF8
)
return
0
;
if
(
p_buf
[
0
]
!=
0xFF
||
(
p_buf
[
1
]
&
0xFE
)
!=
0xF8
)
return
0
;
/* Check there is no emulated sync code in the rest of the header */
/* Check there is no emulated sync code in the rest of the header */
if
(
p_buf
[
2
]
==
0xff
||
p_buf
[
3
]
==
0xFF
)
return
0
;
if
(
p_buf
[
2
]
==
0xff
||
p_buf
[
3
]
==
0xFF
)
return
0
;
/* Find blocksize (framelength) */
/* Find blocksize (framelength) */
switch
(
i_temp
=
p_buf
[
2
]
>>
4
)
switch
(
i_temp
=
p_buf
[
2
]
>>
4
)
{
{
case
0
:
case
0
:
if
(
p_sys
->
b_stream_info
&&
if
(
p_sys
->
b_stream_info
&&
p_sys
->
stream_info
.
min_blocksize
==
p_sys
->
stream_info
.
max_blocksize
)
p_sys
->
stream_info
.
min_blocksize
==
p_sys
->
stream_info
.
max_blocksize
)
i_blocksize
=
p_sys
->
stream_info
.
min_blocksize
;
i_blocksize
=
p_sys
->
stream_info
.
min_blocksize
;
else
return
0
;
/* We can't do anything with this */
else
return
0
;
/* We can't do anything with this */
break
;
break
;
...
@@ -444,16 +421,15 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
...
@@ -444,16 +421,15 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
i_blocksize
=
256
<<
(
i_temp
-
8
);
i_blocksize
=
256
<<
(
i_temp
-
8
);
break
;
break
;
}
}
if
(
p_sys
->
b_stream_info
&&
if
(
p_sys
->
b_stream_info
&&
(
i_blocksize
<
p_sys
->
stream_info
.
min_blocksize
||
(
i_blocksize
<
p_sys
->
stream_info
.
min_blocksize
||
i_blocksize
>
p_sys
->
stream_info
.
max_blocksize
)
)
i_blocksize
>
p_sys
->
stream_info
.
max_blocksize
)
)
return
0
;
return
0
;
/* Find samplerate */
/* Find samplerate */
switch
(
i_temp
=
p_buf
[
2
]
&
0x0f
)
switch
(
i_temp
=
p_buf
[
2
]
&
0x0f
)
{
{
case
0
:
case
0
:
if
(
p_sys
->
b_stream_info
)
if
(
p_sys
->
b_stream_info
)
*
pi_sample_rate
=
p_sys
->
stream_info
.
sample_rate
;
*
pi_sample_rate
=
p_sys
->
stream_info
.
sample_rate
;
else
return
0
;
/* We can't do anything with this */
else
return
0
;
/* We can't do anything with this */
break
;
break
;
...
@@ -514,22 +490,17 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
...
@@ -514,22 +490,17 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
/* Find channels */
/* Find channels */
i_temp
=
(
unsigned
)(
p_buf
[
3
]
>>
4
);
i_temp
=
(
unsigned
)(
p_buf
[
3
]
>>
4
);
if
(
i_temp
&
8
)
if
(
i_temp
&
8
)
{
{
if
((
i_temp
&
7
)
>=
3
)
if
(
(
i_temp
&
7
)
>=
3
)
return
0
;
return
0
;
*
pi_channels
=
2
;
*
pi_channels
=
2
;
}
}
else
else
{
*
pi_channels
=
i_temp
+
1
;
*
pi_channels
=
i_temp
+
1
;
}
/* Find bits per sample */
/* Find bits per sample */
switch
(
i_temp
=
(
unsigned
)(
p_buf
[
3
]
&
0x0e
)
>>
1
)
switch
(
i_temp
=
(
unsigned
)(
p_buf
[
3
]
&
0x0e
)
>>
1
)
{
{
case
0
:
case
0
:
if
(
p_sys
->
b_stream_info
)
if
(
p_sys
->
b_stream_info
)
*
pi_bits_per_sample
=
p_sys
->
stream_info
.
bits_per_sample
;
*
pi_bits_per_sample
=
p_sys
->
stream_info
.
bits_per_sample
;
else
else
return
0
;
return
0
;
...
@@ -562,23 +533,21 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
...
@@ -562,23 +533,21 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
}
}
/* Zero padding bit */
/* Zero padding bit */
if
(
p_buf
[
3
]
&
0x01
)
return
0
;
if
(
p_buf
[
3
]
&
0x01
)
return
0
;
/* End of fixed size header */
/* End of fixed size header */
i_header
=
4
;
i_header
=
4
;
/* Check Sample/Frame number */
/* Check Sample/Frame number */
if
(
read_utf8
(
&
p_buf
[
i_header
++
],
&
i_read
)
==
INT64_C
(
0xffffffffffffffff
)
)
if
(
read_utf8
(
&
p_buf
[
i_header
++
],
&
i_read
)
==
INT64_C
(
0xffffffffffffffff
)
)
return
0
;
return
0
;
i_header
+=
i_read
;
i_header
+=
i_read
;
/* Read blocksize */
/* Read blocksize */
if
(
i_blocksize_hint
)
if
(
i_blocksize_hint
)
{
{
int
i_val1
=
p_buf
[
i_header
++
];
int
i_val1
=
p_buf
[
i_header
++
];
if
(
i_blocksize_hint
==
7
)
if
(
i_blocksize_hint
==
7
)
{
{
int
i_val2
=
p_buf
[
i_header
++
];
int
i_val2
=
p_buf
[
i_header
++
];
i_val1
=
(
i_val1
<<
8
)
|
i_val2
;
i_val1
=
(
i_val1
<<
8
)
|
i_val2
;
}
}
...
@@ -586,88 +555,67 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
...
@@ -586,88 +555,67 @@ static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
}
}
/* Read sample rate */
/* Read sample rate */
if
(
i_sample_rate_hint
)
if
(
i_sample_rate_hint
)
{
{
int
i_val1
=
p_buf
[
i_header
++
];
int
i_val1
=
p_buf
[
i_header
++
];
if
(
i_sample_rate_hint
!=
12
)
if
(
i_sample_rate_hint
!=
12
)
{
{
int
i_val2
=
p_buf
[
i_header
++
];
int
i_val2
=
p_buf
[
i_header
++
];
i_val1
=
(
i_val1
<<
8
)
|
i_val2
;
i_val1
=
(
i_val1
<<
8
)
|
i_val2
;
}
}
if
(
i_sample_rate_hint
==
12
)
*
pi_sample_rate
=
i_val1
*
1000
;
if
(
i_sample_rate_hint
==
12
)
*
pi_sample_rate
=
i_val1
*
1000
;
else
if
(
i_sample_rate_hint
==
13
)
*
pi_sample_rate
=
i_val1
;
else
if
(
i_sample_rate_hint
==
13
)
*
pi_sample_rate
=
i_val1
;
else
*
pi_sample_rate
=
i_val1
*
10
;
else
*
pi_sample_rate
=
i_val1
*
10
;
}
}
/* Check the CRC-8 byte */
/* Check the CRC-8 byte */
if
(
flac_crc8
(
p_buf
,
i_header
)
!=
p_buf
[
i_header
]
)
if
(
flac_crc8
(
p_buf
,
i_header
)
!=
p_buf
[
i_header
])
{
return
0
;
return
0
;
}
/* Sanity check using stream info header when possible */
/* Sanity check using stream info header when possible */
if
(
p_sys
->
b_stream_info
)
if
(
p_sys
->
b_stream_info
)
{
{
if
(
i_blocksize
<
p_sys
->
stream_info
.
min_blocksize
||
if
(
i_blocksize
<
p_sys
->
stream_info
.
min_blocksize
||
i_blocksize
>
p_sys
->
stream_info
.
max_blocksize
)
i_blocksize
>
p_sys
->
stream_info
.
max_blocksize
)
return
0
;
return
0
;
if
(
*
pi_bits_per_sample
!=
p_sys
->
stream_info
.
bits_per_sample
)
if
(
*
pi_bits_per_sample
!=
p_sys
->
stream_info
.
bits_per_sample
)
return
0
;
return
0
;
if
(
*
pi_sample_rate
!=
p_sys
->
stream_info
.
sample_rate
)
if
(
*
pi_sample_rate
!=
p_sys
->
stream_info
.
sample_rate
)
return
0
;
return
0
;
}
}
return
i_blocksize
;
return
i_blocksize
;
}
}
/* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
/* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
static
uint64_t
read_utf8
(
const
uint8_t
*
p_buf
,
int
*
pi_read
)
static
uint64_t
read_utf8
(
const
uint8_t
*
p_buf
,
int
*
pi_read
)
{
{
uint64_t
i_result
=
0
;
uint64_t
i_result
=
0
;
unsigned
i
,
j
;
unsigned
i
;
if
(
!
(
p_buf
[
0
]
&
0x80
)
)
/* 0xxxxxxx */
if
(
!
(
p_buf
[
0
]
&
0x80
))
{
/* 0xxxxxxx */
{
i_result
=
p_buf
[
0
];
i_result
=
p_buf
[
0
];
i
=
0
;
i
=
0
;
}
}
else
if
(
p_buf
[
0
]
&
0xC0
&&
!
(
p_buf
[
0
]
&
0x20
))
{
/* 110xxxxx */
else
if
(
p_buf
[
0
]
&
0xC0
&&
!
(
p_buf
[
0
]
&
0x20
)
)
/* 110xxxxx */
{
i_result
=
p_buf
[
0
]
&
0x1F
;
i_result
=
p_buf
[
0
]
&
0x1F
;
i
=
1
;
i
=
1
;
}
}
else
if
(
p_buf
[
0
]
&
0xE0
&&
!
(
p_buf
[
0
]
&
0x10
))
{
/* 1110xxxx */
else
if
(
p_buf
[
0
]
&
0xE0
&&
!
(
p_buf
[
0
]
&
0x10
)
)
/* 1110xxxx */
{
i_result
=
p_buf
[
0
]
&
0x0F
;
i_result
=
p_buf
[
0
]
&
0x0F
;
i
=
2
;
i
=
2
;
}
}
else
if
(
p_buf
[
0
]
&
0xF0
&&
!
(
p_buf
[
0
]
&
0x08
))
{
/* 11110xxx */
else
if
(
p_buf
[
0
]
&
0xF0
&&
!
(
p_buf
[
0
]
&
0x08
)
)
/* 11110xxx */
{
i_result
=
p_buf
[
0
]
&
0x07
;
i_result
=
p_buf
[
0
]
&
0x07
;
i
=
3
;
i
=
3
;
}
}
else
if
(
p_buf
[
0
]
&
0xF8
&&
!
(
p_buf
[
0
]
&
0x04
))
{
/* 111110xx */
else
if
(
p_buf
[
0
]
&
0xF8
&&
!
(
p_buf
[
0
]
&
0x04
)
)
/* 111110xx */
{
i_result
=
p_buf
[
0
]
&
0x03
;
i_result
=
p_buf
[
0
]
&
0x03
;
i
=
4
;
i
=
4
;
}
}
else
if
(
p_buf
[
0
]
&
0xFC
&&
!
(
p_buf
[
0
]
&
0x02
))
{
/* 1111110x */
else
if
(
p_buf
[
0
]
&
0xFC
&&
!
(
p_buf
[
0
]
&
0x02
)
)
/* 1111110x */
{
i_result
=
p_buf
[
0
]
&
0x01
;
i_result
=
p_buf
[
0
]
&
0x01
;
i
=
5
;
i
=
5
;
}
}
else
if
(
p_buf
[
0
]
&
0xFE
&&
!
(
p_buf
[
0
]
&
0x01
))
{
/* 11111110 */
else
if
(
p_buf
[
0
]
&
0xFE
&&
!
(
p_buf
[
0
]
&
0x01
)
)
/* 11111110 */
{
i_result
=
0
;
i_result
=
0
;
i
=
6
;
i
=
6
;
}
}
else
{
else
{
return
INT64_C
(
0xffffffffffffffff
);
return
INT64_C
(
0xffffffffffffffff
);
}
}
for
(
j
=
1
;
j
<=
i
;
j
++
)
for
(
unsigned
j
=
1
;
j
<=
i
;
j
++
)
{
{
if
(
!
(
p_buf
[
j
]
&
0x80
)
||
(
p_buf
[
j
]
&
0x40
))
{
/* 10xxxxxx */
if
(
!
(
p_buf
[
j
]
&
0x80
)
||
(
p_buf
[
j
]
&
0x40
)
)
/* 10xxxxxx */
{
return
INT64_C
(
0xffffffffffffffff
);
return
INT64_C
(
0xffffffffffffffff
);
}
}
i_result
<<=
6
;
i_result
<<=
6
;
...
@@ -714,13 +662,12 @@ static const uint8_t flac_crc8_table[256] = {
...
@@ -714,13 +662,12 @@ static const uint8_t flac_crc8_table[256] = {
0xE6
,
0xE1
,
0xE8
,
0xEF
,
0xFA
,
0xFD
,
0xF4
,
0xF3
0xE6
,
0xE1
,
0xE8
,
0xEF
,
0xFA
,
0xFD
,
0xF4
,
0xF3
};
};
static
uint8_t
flac_crc8
(
const
uint8_t
*
data
,
unsigned
len
)
static
uint8_t
flac_crc8
(
const
uint8_t
*
data
,
unsigned
len
)
{
{
uint8_t
crc
=
0
;
uint8_t
crc
=
0
;
while
(
len
--
)
while
(
len
--
)
crc
=
flac_crc8_table
[
crc
^
*
data
++
];
crc
=
flac_crc8_table
[
crc
^
*
data
++
];
return
crc
;
return
crc
;
}
}
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