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
22c1b3b1
Commit
22c1b3b1
authored
Jan 17, 2000
by
Michel Kaempf
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* Rajout du d�but du d�codeur ac3 ;
parent
b278b2a6
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
300 additions
and
0 deletions
+300
-0
include/ac3_decoder.h
include/ac3_decoder.h
+49
-0
src/ac3_decoder/ac3_decoder.c
src/ac3_decoder/ac3_decoder.c
+251
-0
No files found.
include/ac3_decoder.h
0 → 100644
View file @
22c1b3b1
/*****************************************************************************
* ac3_decoder.h : ac3 decoder thread interface
* (c)1999 VideoLAN
*****************************************************************************/
#define AC3DEC_FRAME_SIZE (2*256)
/*****************************************************************************
* ac3dec_frame_t
*****************************************************************************/
typedef
s16
ac3dec_frame_t
[
AC3DEC_FRAME_SIZE
];
/*****************************************************************************
* ac3dec_thread_t : ac3 decoder thread descriptor
*****************************************************************************/
typedef
struct
ac3dec_thread_s
{
/*
* Thread properties
*/
vlc_thread_t
thread_id
;
/* id for thread functions */
boolean_t
b_die
;
/* `die' flag */
boolean_t
b_error
;
/* `error' flag */
/*
* Input properties
*/
decoder_fifo_t
fifo
;
/* stores the PES stream data */
/* The bit stream structure handles the PES stream at the bit level */
bit_stream_t
bit_stream
;
/*
* Decoder properties
*/
unsigned
int
total_bits_read
;
/*
* Output properties
*/
aout_fifo_t
*
p_aout_fifo
;
/* stores the decompressed audio frames */
aout_thread_t
*
p_aout
;
/* needed to create the audio fifo */
}
ac3dec_thread_t
;
/*****************************************************************************
* Prototypes
*****************************************************************************/
ac3dec_thread_t
*
ac3dec_CreateThread
(
input_thread_t
*
p_input
);
void
ac3dec_DestroyThread
(
ac3dec_thread_t
*
p_ac3dec
);
src/ac3_decoder/ac3_decoder.c
0 → 100644
View file @
22c1b3b1
/*****************************************************************************
* ac3_decoder.c: ac3 decoder thread
* (c)1999 VideoLAN
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <unistd.h>
/* getpid() */
#include <stdio.h>
/* "intf_msg.h" */
#include <stdlib.h>
/* malloc(), free() */
#include <sys/soundcard.h>
/* "audio_output.h" */
#include <sys/uio.h>
/* "input.h" */
#include "common.h"
#include "config.h"
#include "mtime.h"
#include "vlc_thread.h"
#include "debug.h"
/* "input_netlist.h" */
#include "intf_msg.h"
/* intf_DbgMsg(), intf_ErrMsg() */
#include "input.h"
/* pes_packet_t */
#include "input_netlist.h"
/* input_NetlistFreePES() */
#include "decoder_fifo.h"
/* DECODER_FIFO_(ISEMPTY|START|INCSTART)() */
#include "audio_output.h"
#include "ac3_decoder.h"
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
InitThread
(
ac3dec_thread_t
*
p_adec
);
static
void
RunThread
(
ac3dec_thread_t
*
p_adec
);
static
void
ErrorThread
(
ac3dec_thread_t
*
p_adec
);
static
void
EndThread
(
ac3dec_thread_t
*
p_adec
);
//static byte_t GetByte ( bit_stream_t * p_bit_stream );
//static void NeedBits ( bit_stream_t * p_bit_stream, int i_bits );
//static void DumpBits ( bit_stream_t * p_bit_stream, int i_bits );
//static int FindHeader ( adec_thread_t * p_adec );
/*****************************************************************************
* ac3dec_CreateThread: creates an ac3 decoder thread
*****************************************************************************/
ac3dec_thread_t
*
ac3dec_CreateThread
(
input_thread_t
*
p_input
)
{
ac3dec_thread_t
*
p_ac3dec
;
intf_DbgMsg
(
"ac3dec debug: creating ac3 decoder thread
\n
"
);
/* Allocate the memory needed to store the thread's structure */
if
(
(
p_ac3dec
=
(
ac3dec_thread_t
*
)
malloc
(
sizeof
(
ac3dec_thread_t
)
))
==
NULL
)
{
intf_ErrMsg
(
"ac3dec error: not enough memory for ac3dec_CreateThread() to create the new thread
\n
"
);
return
(
NULL
);
}
/*
* Initialize the thread properties
*/
p_ac3dec
->
b_die
=
0
;
p_ac3dec
->
b_error
=
0
;
/*
* Initialize the input properties
*/
/* Initialize the decoder fifo's data lock and conditional variable and set
* its buffer as empty */
vlc_mutex_init
(
&
p_ac3dec
->
fifo
.
data_lock
);
vlc_cond_init
(
&
p_ac3dec
->
fifo
.
data_wait
);
p_ac3dec
->
fifo
.
i_start
=
0
;
p_ac3dec
->
fifo
.
i_end
=
0
;
/* Initialize the bit stream structure */
p_ac3dec
->
bit_stream
.
p_input
=
p_input
;
p_ac3dec
->
bit_stream
.
p_decoder_fifo
=
&
p_ac3dec
->
fifo
;
p_ac3dec
->
bit_stream
.
fifo
.
buffer
=
0
;
p_ac3dec
->
bit_stream
.
fifo
.
i_available
=
0
;
/*
* Initialize the output properties
*/
p_ac3dec
->
p_aout
=
p_input
->
p_aout
;
p_ac3dec
->
p_aout_fifo
=
NULL
;
/* Spawn the ac3 decoder thread */
if
(
vlc_thread_create
(
&
p_ac3dec
->
thread_id
,
"ac3 decoder"
,
(
vlc_thread_func_t
)
RunThread
,
(
void
*
)
p_ac3dec
)
)
{
intf_ErrMsg
(
"ac3dec error: can't spawn ac3 decoder thread
\n
"
);
free
(
p_ac3dec
);
return
(
NULL
);
}
intf_DbgMsg
(
"ac3dec debug: ac3 decoder thread (%p) created
\n
"
,
p_ac3dec
);
return
(
p_ac3dec
);
}
/*****************************************************************************
* ac3dec_DestroyThread: destroys an ac3 decoder thread
*****************************************************************************/
void
ac3dec_DestroyThread
(
ac3dec_thread_t
*
p_ac3dec
)
{
intf_DbgMsg
(
"ac3dec debug: requesting termination of ac3 decoder thread %p
\n
"
,
p_ac3dec
);
/* Ask thread to kill itself */
p_ac3dec
->
b_die
=
1
;
/* Make sure the decoder thread leaves the GetByte() function */
vlc_mutex_lock
(
&
(
p_ac3dec
->
fifo
.
data_lock
)
);
vlc_cond_signal
(
&
(
p_ac3dec
->
fifo
.
data_wait
)
);
vlc_mutex_unlock
(
&
(
p_ac3dec
->
fifo
.
data_lock
)
);
/* Waiting for the decoder thread to exit */
/* Remove this as soon as the "status" flag is implemented */
vlc_thread_join
(
p_ac3dec
->
thread_id
);
}
/* Following functions are local */
/*****************************************************************************
* decode_find_sync()
*****************************************************************************/
static
__inline__
int
decode_find_sync
(
ac3dec_thread_t
*
p_ac3dec
)
{
while
(
(
!
p_ac3dec
->
b_die
)
&&
(
!
p_ac3dec
->
b_error
)
)
{
NeedBits
(
&
(
p_ac3dec
->
bit_stream
),
16
);
if
(
(
p_ac3dec
->
bit_stream
.
fifo
.
buffer
>>
(
32
-
16
))
==
0x0b77
)
{
DumpBits
(
&
(
p_ac3dec
->
bit_stream
),
16
);
p_ac3dec
->
total_bits_read
=
16
;
return
(
0
);
}
DumpBits
(
&
(
p_ac3dec
->
bit_stream
),
1
);
}
return
(
-
1
);
}
/*****************************************************************************
* InitThread : initialize an ac3 decoder thread
*****************************************************************************/
static
int
InitThread
(
ac3dec_thread_t
*
p_ac3dec
)
{
aout_fifo_t
aout_fifo
;
intf_DbgMsg
(
"ac3dec debug: initializing ac3 decoder thread %p
\n
"
,
p_ac3dec
);
/* Our first job is to initialize the bit stream structure with the
* beginning of the input stream */
vlc_mutex_lock
(
&
p_ac3dec
->
fifo
.
data_lock
);
while
(
DECODER_FIFO_ISEMPTY
(
p_ac3dec
->
fifo
)
)
{
vlc_cond_wait
(
&
p_ac3dec
->
fifo
.
data_wait
,
&
p_ac3dec
->
fifo
.
data_lock
);
}
p_ac3dec
->
bit_stream
.
p_ts
=
DECODER_FIFO_START
(
p_ac3dec
->
fifo
)
->
p_first_ts
;
p_ac3dec
->
bit_stream
.
i_byte
=
p_ac3dec
->
bit_stream
.
p_ts
->
i_payload_start
;
vlc_mutex_unlock
(
&
p_ac3dec
->
fifo
.
data_lock
);
aout_fifo
.
i_type
=
AOUT_ADEC_STEREO_FIFO
;
aout_fifo
.
b_stereo
=
1
;
aout_fifo
.
l_frame_size
=
AC3DEC_FRAME_SIZE
;
/* Creating the audio output fifo */
if
(
(
p_ac3dec
->
p_aout_fifo
=
aout_CreateFifo
(
p_ac3dec
->
p_aout
,
&
aout_fifo
))
==
NULL
)
{
return
(
-
1
);
}
intf_DbgMsg
(
"ac3dec debug: ac3 decoder thread %p initialized
\n
"
,
p_ac3dec
);
return
(
0
);
}
/*****************************************************************************
* RunThread : ac3 decoder thread
*****************************************************************************/
static
void
RunThread
(
ac3dec_thread_t
*
p_ac3dec
)
{
intf_DbgMsg
(
"ac3dec debug: running ac3 decoder thread (%p) (pid == %i)
\n
"
,
p_ac3dec
,
getpid
()
);
/* Initializing the ac3 decoder thread */
if
(
InitThread
(
p_ac3dec
)
)
{
p_ac3dec
->
b_error
=
1
;
}
/* ac3 decoder thread's main loop */
while
(
(
!
p_ac3dec
->
b_die
)
&&
(
!
p_ac3dec
->
b_error
)
)
{
if
(
decode_find_sync
(
p_ac3dec
)
==
0
)
{
fprintf
(
stderr
,
"ac3dec debug: decode_find_sync() == 0
\n
"
);
}
}
/* If b_error is set, the ac3 decoder thread enters the error loop */
if
(
p_ac3dec
->
b_error
)
{
ErrorThread
(
p_ac3dec
);
}
/* End of the ac3 decoder thread */
EndThread
(
p_ac3dec
);
}
/*****************************************************************************
* ErrorThread : ac3 decoder's RunThread() error loop
*****************************************************************************/
static
void
ErrorThread
(
ac3dec_thread_t
*
p_ac3dec
)
{
/* We take the lock, because we are going to read/write the start/end
* indexes of the decoder fifo */
vlc_mutex_lock
(
&
p_ac3dec
->
fifo
.
data_lock
);
/* Wait until a `die' order is sent */
while
(
!
p_ac3dec
->
b_die
)
{
/* Trash all received PES packets */
while
(
!
DECODER_FIFO_ISEMPTY
(
p_ac3dec
->
fifo
)
)
{
input_NetlistFreePES
(
p_ac3dec
->
bit_stream
.
p_input
,
DECODER_FIFO_START
(
p_ac3dec
->
fifo
)
);
DECODER_FIFO_INCSTART
(
p_ac3dec
->
fifo
);
}
/* Waiting for the input thread to put new PES packets in the fifo */
vlc_cond_wait
(
&
p_ac3dec
->
fifo
.
data_wait
,
&
p_ac3dec
->
fifo
.
data_lock
);
}
/* We can release the lock before leaving */
vlc_mutex_unlock
(
&
p_ac3dec
->
fifo
.
data_lock
);
}
/*****************************************************************************
* EndThread : ac3 decoder thread destruction
*****************************************************************************/
static
void
EndThread
(
ac3dec_thread_t
*
p_ac3dec
)
{
intf_DbgMsg
(
"ac3dec debug: destroying ac3 decoder thread %p
\n
"
,
p_ac3dec
);
/* If the audio output fifo was created, we destroy it */
if
(
p_ac3dec
->
p_aout_fifo
!=
NULL
)
{
aout_DestroyFifo
(
p_ac3dec
->
p_aout_fifo
);
}
/* Destroy descriptor */
free
(
p_ac3dec
);
intf_DbgMsg
(
"ac3dec debug: ac3 decoder thread %p destroyed
\n
"
,
p_ac3dec
);
}
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