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
eee7f389
Commit
eee7f389
authored
Dec 21, 1999
by
Stéphane Borel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
*** empty log message ***
parent
8ee76f64
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
296 additions
and
98 deletions
+296
-98
include/parser_fifo.h
include/parser_fifo.h
+196
-0
include/video_parser.h
include/video_parser.h
+8
-8
src/video_parser/video_parser.c
src/video_parser/video_parser.c
+92
-90
No files found.
include/parser_fifo.h
0 → 100644
View file @
eee7f389
/******************************************************************************
* parser_fifo.h: interface for parsers PES fifo
* (c)1999 VideoLAN
******************************************************************************
* Required headers:
* - "config.h"
* - "common.h"
* - "vlc_thread.h"
* - "input.h"
******************************************************************************/
/******************************************************************************
* Macros
******************************************************************************/
/* ?? move to inline functions */
#define PARSER_FIFO_ISEMPTY( fifo ) ( (fifo).i_start == (fifo).i_end )
#define PARSER_FIFO_ISFULL( fifo ) ( ( ( (fifo).i_end + 1 - (fifo).i_start ) \
& FIFO_SIZE ) == 0 )
#define PARSER_FIFO_START( fifo ) ( (fifo).buffer[ (fifo).i_start ] )
#define PARSER_FIFO_INCSTART( fifo ) ( (fifo).i_start = ((fifo).i_start + 1) \
& FIFO_SIZE )
#define PARSER_FIFO_END( fifo ) ( (fifo).buffer[ (fifo).i_end ] )
#define PARSER_FIFO_INCEND( fifo ) ( (fifo).i_end = ((fifo).i_end + 1) \
& FIFO_SIZE )
/******************************************************************************
* parser_fifo_t
******************************************************************************
* This rotative FIFO contains PES packets that are to be decoded...
******************************************************************************/
typedef
struct
{
vlc_mutex_t
data_lock
;
/* fifo data lock */
vlc_cond_t
data_wait
;
/* fifo data conditional variable */
/* buffer is an array of PES packets pointers */
pes_packet_t
*
buffer
[
FIFO_SIZE
+
1
];
int
i_start
;
int
i_end
;
}
parser_fifo_t
;
/******************************************************************************
* bit_fifo_t : bit fifo descriptor
******************************************************************************
* This type describes a bit fifo used to store bits while working with the
* input stream at the bit level.
******************************************************************************/
typedef
struct
bit_fifo_s
{
/* This unsigned integer allows us to work at the bit level. This buffer
* can contain 32 bits, and the used space can be found on the MSb's side
* and the available space on the LSb's side. */
u32
buffer
;
/* Number of bits available in the bit buffer */
int
i_available
;
}
bit_fifo_t
;
/******************************************************************************
* bit_stream_t : bit stream descriptor
******************************************************************************
* This type, based on a PES stream, includes all the structures needed to
* handle the input stream like a bit stream.
******************************************************************************/
typedef
struct
bit_stream_s
{
/*
* Input structures
*/
/* The input thread feeds the stream with fresh PES packets */
input_thread_t
*
p_input
;
/* The parser fifo contains the data of the PES stream */
parser_fifo_t
*
p_parser_fifo
;
/*
* Byte structures
*/
/* Current TS packet (in the current PES packet of the PES stream) */
ts_packet_t
*
p_ts
;
/* Index of the next byte that is to be read (in the current TS packet) */
unsigned
int
i_byte
;
/*
* Bit structures
*/
bit_fifo_t
fifo
;
}
bit_stream_t
;
/*****************************************************************************
* GetByte : reads the next byte in the input stream
*****************************************************************************/
static
__inline__
byte_t
GetByte
(
bit_stream_t
*
p_bit_stream
)
{
/* Is the input thread dying ? */
if
(
p_bit_stream
->
p_input
->
b_die
)
{
return
(
0
);
}
/* Are there some bytes left in the current TS packet ? */
if
(
p_bit_stream
->
i_byte
<
p_bit_stream
->
p_ts
->
i_payload_end
)
{
return
(
p_bit_stream
->
p_ts
->
buffer
[
p_bit_stream
->
i_byte
++
]
);
}
else
{
/* We are looking for the next TS packet that contains real data,
* and not just a PES header */
do
{
/* We were reading the last TS packet of this PES packet... It's
* time to jump to the next PES packet */
if
(
p_bit_stream
->
p_ts
->
p_next_ts
==
NULL
)
{
/* We are going to read/write the start and end indexes of the
* parser fifo and to use the fifo's conditional variable,
* that's why we need to take the lock before */
vlc_mutex_lock
(
&
p_bit_stream
->
p_parser_fifo
->
data_lock
);
/* We should increase the start index of the parser fifo, but
* if we do this now, the input thread could overwrite the
* pointer to the current PES packet, and we weren't able to
* give it back to the netlist. That's why we free the PES
* packet first. */
input_NetlistFreePES
(
p_bit_stream
->
p_input
,
PARSER_FIFO_START
(
*
p_bit_stream
->
p_parser_fifo
)
);
PARSER_FIFO_INCSTART
(
*
p_bit_stream
->
p_parser_fifo
);
while
(
PARSER_FIFO_ISEMPTY
(
*
p_bit_stream
->
p_parser_fifo
)
)
{
vlc_cond_wait
(
&
p_bit_stream
->
p_parser_fifo
->
data_wait
,
&
p_bit_stream
->
p_parser_fifo
->
data_lock
);
if
(
p_bit_stream
->
p_input
->
b_die
)
{
vlc_mutex_unlock
(
&
(
p_bit_stream
->
p_parser_fifo
->
data_lock
)
);
return
(
0
);
}
}
/* The next byte could be found in the next PES packet */
p_bit_stream
->
p_ts
=
PARSER_FIFO_START
(
*
p_bit_stream
->
p_parser_fifo
)
->
p_first_ts
;
/* We can release the fifo's data lock */
vlc_mutex_unlock
(
&
p_bit_stream
->
p_parser_fifo
->
data_lock
);
}
/* Perhaps the next TS packet of the current PES packet contains
* real data (ie its payload's size is greater than 0) */
else
{
p_bit_stream
->
p_ts
=
p_bit_stream
->
p_ts
->
p_next_ts
;
}
}
while
(
p_bit_stream
->
p_ts
->
i_payload_start
==
p_bit_stream
->
p_ts
->
i_payload_end
);
/* We've found a TS packet which contains interesting data... As we
* return the payload's first byte, we set i_byte to the following
* one */
p_bit_stream
->
i_byte
=
p_bit_stream
->
p_ts
->
i_payload_start
;
return
(
p_bit_stream
->
p_ts
->
buffer
[
p_bit_stream
->
i_byte
++
]
);
}
}
/******************************************************************************
* NeedBits : reads i_bits new bits in the bit stream and stores them in the
* bit buffer
******************************************************************************
* - i_bits must be less or equal 32 !
* - There is something important to notice with that function : if the number
* of bits available in the bit buffer when calling NeedBits() is greater than
* 24 (i_available > 24) but less than the number of needed bits
* (i_available < i_bits), the byte returned by GetByte() will be shifted with
* a negative value and the number of bits available in the bit buffer will be
* set to more than 32 !
******************************************************************************/
static
__inline__
void
NeedBits
(
bit_stream_t
*
p_bit_stream
,
int
i_bits
)
{
while
(
p_bit_stream
->
fifo
.
i_available
<
i_bits
)
{
p_bit_stream
->
fifo
.
buffer
|=
((
u32
)
GetByte
(
p_bit_stream
))
<<
(
24
-
p_bit_stream
->
fifo
.
i_available
);
p_bit_stream
->
fifo
.
i_available
+=
8
;
}
}
/******************************************************************************
* DumpBits : removes i_bits bits from the bit buffer
******************************************************************************
* - i_bits <= i_available
* - i_bits < 32 (because (u32 << 32) <=> (u32 = u32))
******************************************************************************/
static
__inline__
void
DumpBits
(
bit_stream_t
*
p_bit_stream
,
int
i_bits
)
{
p_bit_stream
->
fifo
.
buffer
<<=
i_bits
;
p_bit_stream
->
fifo
.
i_available
-=
i_bits
;
}
include/video_parser.h
View file @
eee7f389
/*******************************************************************************
/*******************************************************************************
* video_
decoder.h : video decod
er thread
* video_
parser.h : video pars
er thread
* (c)1999 VideoLAN
* (c)1999 VideoLAN
*******************************************************************************
*******************************************************************************
*******************************************************************************
*******************************************************************************
...
@@ -11,15 +11,15 @@
...
@@ -11,15 +11,15 @@
* "input.h"
* "input.h"
* "video.h"
* "video.h"
* "video_output.h"
* "video_output.h"
* "
decod
er_fifo.h"
* "
pars
er_fifo.h"
*******************************************************************************/
*******************************************************************************/
/*******************************************************************************
/*******************************************************************************
* v
dec_thread_t: video decod
er thread descriptor
* v
par_thread_t: video pars
er thread descriptor
*******************************************************************************
*******************************************************************************
* ??
* ??
*******************************************************************************/
*******************************************************************************/
typedef
struct
v
dec
_thread_s
typedef
struct
v
par
_thread_s
{
{
/* Thread properties and locks */
/* Thread properties and locks */
boolean_t
b_die
;
/* `die' flag */
boolean_t
b_die
;
/* `die' flag */
...
@@ -35,7 +35,7 @@ typedef struct vdec_thread_s
...
@@ -35,7 +35,7 @@ typedef struct vdec_thread_s
/* Input properties */
/* Input properties */
decod
er_fifo_t
fifo
;
/* PES input fifo */
pars
er_fifo_t
fifo
;
/* PES input fifo */
/* The bit stream structure handles the PES stream at the bit level */
/* The bit stream structure handles the PES stream at the bit level */
bit_stream_t
bit_stream
;
bit_stream_t
bit_stream
;
...
@@ -58,16 +58,16 @@ typedef struct vdec_thread_s
...
@@ -58,16 +58,16 @@ typedef struct vdec_thread_s
count_t
c_decoded_p_pictures
;
/* number of P pictures decoded */
count_t
c_decoded_p_pictures
;
/* number of P pictures decoded */
count_t
c_decoded_b_pictures
;
/* number of B pictures decoded */
count_t
c_decoded_b_pictures
;
/* number of B pictures decoded */
#endif
#endif
}
v
dec
_thread_t
;
}
v
par
_thread_t
;
/*******************************************************************************
/*******************************************************************************
* Prototypes
* Prototypes
*******************************************************************************/
*******************************************************************************/
/* Thread management functions */
/* Thread management functions */
v
dec_thread_t
*
vdec
_CreateThread
(
/* video_cfg_t *p_cfg, */
input_thread_t
*
p_input
/*,
v
par_thread_t
*
vpar
_CreateThread
(
/* video_cfg_t *p_cfg, */
input_thread_t
*
p_input
/*,
vout_thread_t *p_vout, int *pi_status */
);
vout_thread_t *p_vout, int *pi_status */
);
void
v
dec_DestroyThread
(
vdec_thread_t
*
p_vdec
/*, int *pi_status */
);
void
v
par_DestroyThread
(
vpar_thread_t
*
p_vpar
/*, int *pi_status */
);
/* Time management functions */
/* Time management functions */
/* ?? */
/* ?? */
...
...
src/video_parser/video_parser.c
View file @
eee7f389
/*******************************************************************************
/*******************************************************************************
* video_
decoder.c : video decod
er thread
* video_
parser.c : video pars
er thread
* (c)1999 VideoLAN
* (c)1999 VideoLAN
*******************************************************************************/
*******************************************************************************/
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
#include "vlc_thread.h"
#include "vlc_thread.h"
#include "intf_msg.h"
#include "intf_msg.h"
#include "debug.h"
/* ?? temporaire, requis par netlist.h */
#include "debug.h"
/* ?? temporaire, requis par netlist.h */
#include "input.h"
#include "input.h"
#include "input_netlist.h"
#include "input_netlist.h"
...
@@ -31,97 +31,99 @@
...
@@ -31,97 +31,99 @@
#include "video.h"
#include "video.h"
#include "video_output.h"
#include "video_output.h"
#include "video_decoder.h"
#include "video_decoder.h"
#include "video_parser.h"
#include "parser_fifo.h"
/*
/*
* Local prototypes
* Local prototypes
*/
*/
//static int CheckConfiguration ( video_cfg_t *p_cfg );
//static int CheckConfiguration ( video_cfg_t *p_cfg );
static
int
InitThread
(
v
dec_thread_t
*
p_vdec
);
static
int
InitThread
(
v
par_thread_t
*
p_vpar
);
static
void
RunThread
(
v
dec_thread_t
*
p_vdec
);
static
void
RunThread
(
v
par_thread_t
*
p_vpar
);
static
void
ErrorThread
(
v
dec_thread_t
*
p_vdec
);
static
void
ErrorThread
(
v
par_thread_t
*
p_vpar
);
static
void
EndThread
(
v
dec_thread_t
*
p_vdec
);
static
void
EndThread
(
v
par_thread_t
*
p_vpar
);
/*******************************************************************************
/*******************************************************************************
* v
dec_CreateThread: create a generic decod
er thread
* v
par_CreateThread: create a generic pars
er thread
*******************************************************************************
*******************************************************************************
* This function creates a new video
decod
er thread, and returns a pointer
* This function creates a new video
pars
er thread, and returns a pointer
* to its description. On error, it returns NULL.
* to its description. On error, it returns NULL.
* Following configuration properties are used:
* Following configuration properties are used:
* ??
* ??
*******************************************************************************/
*******************************************************************************/
v
dec
_thread_t
*
vpar_CreateThread
(
/* video_cfg_t *p_cfg, */
input_thread_t
*
p_input
/*,
v
par
_thread_t
*
vpar_CreateThread
(
/* video_cfg_t *p_cfg, */
input_thread_t
*
p_input
/*,
vout_thread_t *p_vout, int *pi_status */
)
vout_thread_t *p_vout, int *pi_status */
)
{
{
v
dec_thread_t
*
p_vdec
;
v
par_thread_t
*
p_vpar
;
intf_DbgMsg
(
"v
dec debug: creating video decod
er thread
\n
"
);
intf_DbgMsg
(
"v
par debug: creating video pars
er thread
\n
"
);
/* Allocate the memory needed to store the thread's structure */
/* Allocate the memory needed to store the thread's structure */
if
(
(
p_v
dec
=
(
vdec_thread_t
*
)
malloc
(
sizeof
(
vdec
_thread_t
)
))
==
NULL
)
if
(
(
p_v
par
=
(
vpar_thread_t
*
)
malloc
(
sizeof
(
vpar
_thread_t
)
))
==
NULL
)
{
{
intf_ErrMsg
(
"
adec error: not enough memory for vdec
_CreateThread() to create the new thread
\n
"
);
intf_ErrMsg
(
"
vpar error: not enough memory for vpar
_CreateThread() to create the new thread
\n
"
);
return
(
NULL
);
return
(
NULL
);
}
}
/*
/*
* Initialize the thread properties
* Initialize the thread properties
*/
*/
p_v
dec
->
b_die
=
0
;
p_v
par
->
b_die
=
0
;
p_v
dec
->
b_error
=
0
;
p_v
par
->
b_error
=
0
;
/*
/*
* Initialize the input properties
* Initialize the input properties
*/
*/
/* Initialize the
decod
er fifo's data lock and conditional variable and set * its buffer as empty */
/* Initialize the
pars
er fifo's data lock and conditional variable and set * its buffer as empty */
vlc_mutex_init
(
&
p_v
dec
->
fifo
.
data_lock
);
vlc_mutex_init
(
&
p_v
par
->
fifo
.
data_lock
);
vlc_cond_init
(
&
p_v
dec
->
fifo
.
data_wait
);
vlc_cond_init
(
&
p_v
par
->
fifo
.
data_wait
);
p_v
dec
->
fifo
.
i_start
=
0
;
p_v
par
->
fifo
.
i_start
=
0
;
p_v
dec
->
fifo
.
i_end
=
0
;
p_v
par
->
fifo
.
i_end
=
0
;
/* Initialize the bit stream structure */
/* Initialize the bit stream structure */
p_v
dec
->
bit_stream
.
p_input
=
p_input
;
p_v
par
->
bit_stream
.
p_input
=
p_input
;
p_v
dec
->
bit_stream
.
p_decoder_fifo
=
&
p_vdec
->
fifo
;
p_v
par
->
bit_stream
.
p_parser_fifo
=
&
p_vpar
->
fifo
;
p_v
dec
->
bit_stream
.
fifo
.
buffer
=
0
;
p_v
par
->
bit_stream
.
fifo
.
buffer
=
0
;
p_v
dec
->
bit_stream
.
fifo
.
i_available
=
0
;
p_v
par
->
bit_stream
.
fifo
.
i_available
=
0
;
/* Spawn the video
decod
er thread */
/* Spawn the video
pars
er thread */
if
(
vlc_thread_create
(
&
p_v
dec
->
thread_id
,
"video decoder"
,
(
vlc_thread_func
)
RunThread
,
(
void
*
)
p_vdec
)
)
if
(
vlc_thread_create
(
&
p_v
par
->
thread_id
,
"video parser"
,
(
vlc_thread_func
)
RunThread
,
(
void
*
)
p_vpar
)
)
{
{
intf_ErrMsg
(
"v
dec error: can't spawn video decod
er thread
\n
"
);
intf_ErrMsg
(
"v
par error: can't spawn video pars
er thread
\n
"
);
free
(
p_v
dec
);
free
(
p_v
par
);
return
(
NULL
);
return
(
NULL
);
}
}
intf_DbgMsg
(
"v
dec debug: video decoder thread (%p) created
\n
"
,
p_vdec
);
intf_DbgMsg
(
"v
par debug: video parser thread (%p) created
\n
"
,
p_vpar
);
return
(
p_v
dec
);
return
(
p_v
par
);
}
}
/*******************************************************************************
/*******************************************************************************
* v
dec_DestroyThread: destroy a generic decod
er thread
* v
par_DestroyThread: destroy a generic pars
er thread
*******************************************************************************
*******************************************************************************
* Destroy a terminated thread. This function will return 0 if the thread could
* Destroy a terminated thread. This function will return 0 if the thread could
* be destroyed, and non 0 else. The last case probably means that the thread
* be destroyed, and non 0 else. The last case probably means that the thread
* was still active, and another try may succeed.
* was still active, and another try may succeed.
*******************************************************************************/
*******************************************************************************/
void
v
dec_DestroyThread
(
vdec_thread_t
*
p_vdec
/*, int *pi_status */
)
void
v
par
g_DestroyThread
(
vpar_thread_t
*
p_vpar
/*, int *pi_status */
)
{
{
intf_DbgMsg
(
"v
dec debug: requesting termination of video decoder thread %p
\n
"
,
p_vdec
);
intf_DbgMsg
(
"v
par debug: requesting termination of video parser thread %p
\n
"
,
p_vpar
);
/* Ask thread to kill itself */
/* Ask thread to kill itself */
p_v
dec
->
b_die
=
1
;
p_v
par
->
b_die
=
1
;
/* Make sure the
decod
er thread leaves the GetByte() function */
/* Make sure the
pars
er thread leaves the GetByte() function */
vlc_mutex_lock
(
&
(
p_v
dec
->
fifo
.
data_lock
)
);
vlc_mutex_lock
(
&
(
p_v
par
->
fifo
.
data_lock
)
);
vlc_cond_signal
(
&
(
p_v
dec
->
fifo
.
data_wait
)
);
vlc_cond_signal
(
&
(
p_v
par
->
fifo
.
data_wait
)
);
vlc_mutex_unlock
(
&
(
p_v
dec
->
fifo
.
data_lock
)
);
vlc_mutex_unlock
(
&
(
p_v
par
->
fifo
.
data_lock
)
);
/* Waiting for the
decod
er thread to exit */
/* Waiting for the
pars
er thread to exit */
/* Remove this as soon as the "status" flag is implemented */
/* Remove this as soon as the "status" flag is implemented */
vlc_thread_join
(
p_v
dec
->
thread_id
);
vlc_thread_join
(
p_v
par
->
thread_id
);
}
}
/* following functions are local */
/* following functions are local */
/*******************************************************************************
/*******************************************************************************
* CheckConfiguration: check v
dec
_CreateThread() configuration
* CheckConfiguration: check v
par
_CreateThread() configuration
*******************************************************************************
*******************************************************************************
* Set default parameters where required. In DEBUG mode, check if configuration
* Set default parameters where required. In DEBUG mode, check if configuration
* is valid.
* is valid.
...
@@ -136,89 +138,89 @@ static int CheckConfiguration( video_cfg_t *p_cfg )
...
@@ -136,89 +138,89 @@ static int CheckConfiguration( video_cfg_t *p_cfg )
#endif
#endif
/*******************************************************************************
/*******************************************************************************
* InitThread: initialize v
dec
output thread
* InitThread: initialize v
par
output thread
*******************************************************************************
*******************************************************************************
* This function is called from RunThread and performs the second step of the
* This function is called from RunThread and performs the second step of the
* initialization. It returns 0 on success. Note that the thread's flag are not
* initialization. It returns 0 on success. Note that the thread's flag are not
* modified inside this function.
* modified inside this function.
*******************************************************************************/
*******************************************************************************/
static
int
InitThread
(
v
dec_thread_t
*
p_vdec
)
static
int
InitThread
(
v
par_thread_t
*
p_vpar
)
{
{
intf_DbgMsg
(
"v
dec debug: initializing video decoder thread %p
\n
"
,
p_vdec
);
intf_DbgMsg
(
"v
par debug: initializing video parser thread %p
\n
"
,
p_vpar
);
/* Our first job is to initialize the bit stream structure with the
/* Our first job is to initialize the bit stream structure with the
* beginning of the input stream */
* beginning of the input stream */
vlc_mutex_lock
(
&
p_v
dec
->
fifo
.
data_lock
);
vlc_mutex_lock
(
&
p_v
par
->
fifo
.
data_lock
);
while
(
DECODER_FIFO_ISEMPTY
(
p_vdec
->
fifo
)
)
while
(
PARSER_FIFO_ISEMPTY
(
p_vpar
->
fifo
)
)
{
{
vlc_cond_wait
(
&
p_v
dec
->
fifo
.
data_wait
,
&
p_vdec
->
fifo
.
data_lock
);
vlc_cond_wait
(
&
p_v
par
->
fifo
.
data_wait
,
&
p_vpar
->
fifo
.
data_lock
);
}
}
p_v
dec
->
bit_stream
.
p_ts
=
DECODER_FIFO_START
(
p_vdec
->
fifo
)
->
p_first_ts
;
p_v
par
->
bit_stream
.
p_ts
=
PARSER_FIFO_START
(
p_vpar
->
fifo
)
->
p_first_ts
;
p_v
dec
->
bit_stream
.
i_byte
=
p_vdec
->
bit_stream
.
p_ts
->
i_payload_start
;
p_v
par
->
bit_stream
.
i_byte
=
p_vpar
->
bit_stream
.
p_ts
->
i_payload_start
;
vlc_mutex_unlock
(
&
p_v
dec
->
fifo
.
data_lock
);
vlc_mutex_unlock
(
&
p_v
par
->
fifo
.
data_lock
);
#if 0
#if 0
/* ?? */
/* ?? */
/* Create video stream */
/* Create video stream */
p_v
dec->i_stream = vout_CreateStream( p_vdec
->p_vout );
p_v
par->i_stream = vout_CreateStream( p_vpar
->p_vout );
if( p_v
dec
->i_stream < 0 ) /* error */
if( p_v
par
->i_stream < 0 ) /* error */
{
{
return( 1 );
return( 1 );
}
}
/* Initialize
decod
ing data */
/* Initialize
pars
ing data */
/* ?? */
/* ?? */
#endif
#endif
/* Initialize other properties */
/* Initialize other properties */
#ifdef STATS
#ifdef STATS
p_v
dec
->
c_loops
=
0
;
p_v
par
->
c_loops
=
0
;
p_v
dec
->
c_idle_loops
=
0
;
p_v
par
->
c_idle_loops
=
0
;
p_v
dec
->
c_pictures
=
0
;
p_v
par
->
c_pictures
=
0
;
p_v
dec
->
c_i_pictures
=
0
;
p_v
par
->
c_i_pictures
=
0
;
p_v
dec
->
c_p_pictures
=
0
;
p_v
par
->
c_p_pictures
=
0
;
p_v
dec
->
c_b_pictures
=
0
;
p_v
par
->
c_b_pictures
=
0
;
p_v
dec
->
c_decoded_pictures
=
0
;
p_v
par
->
c_decoded_pictures
=
0
;
p_v
dec
->
c_decoded_i_pictures
=
0
;
p_v
par
->
c_decoded_i_pictures
=
0
;
p_v
dec
->
c_decoded_p_pictures
=
0
;
p_v
par
->
c_decoded_p_pictures
=
0
;
p_v
dec
->
c_decoded_b_pictures
=
0
;
p_v
par
->
c_decoded_b_pictures
=
0
;
#endif
#endif
/* Mark thread as running and return */
/* Mark thread as running and return */
intf_DbgMsg
(
"v
dec debug: InitThread(%p) succeeded
\n
"
,
p_vdec
);
intf_DbgMsg
(
"v
par debug: InitThread(%p) succeeded
\n
"
,
p_vpar
);
return
(
0
);
return
(
0
);
}
}
/*******************************************************************************
/*******************************************************************************
* RunThread: generic
decod
er thread
* RunThread: generic
pars
er thread
*******************************************************************************
*******************************************************************************
* Generic
decod
er thread. This function does only returns when the thread is
* Generic
pars
er thread. This function does only returns when the thread is
* terminated.
* terminated.
*******************************************************************************/
*******************************************************************************/
static
void
RunThread
(
v
dec_thread_t
*
p_vdec
)
static
void
RunThread
(
v
par_thread_t
*
p_vpar
)
{
{
intf_DbgMsg
(
"v
dec debug: running video decoder thread (%p) (pid == %i)
\n
"
,
p_vdec
,
getpid
());
intf_DbgMsg
(
"v
par debug: running video parser thread (%p) (pid == %i)
\n
"
,
p_vpar
,
getpid
());
/*
/*
* Initialize thread and free configuration
* Initialize thread and free configuration
*/
*/
p_v
dec
->
b_error
=
InitThread
(
p_vdec
);
p_v
par
->
b_error
=
InitThread
(
p_vpar
);
if
(
p_v
dec
->
b_error
)
if
(
p_v
par
->
b_error
)
{
{
return
;
return
;
}
}
p_v
dec
->
b_run
=
1
;
p_v
par
->
b_run
=
1
;
/* REMOVE ME !!!!! */
/* REMOVE ME !!!!! */
p_v
dec
->
b_error
=
1
;
p_v
par
->
b_error
=
1
;
/*
/*
* Main loop - it is not executed if an error occured during
* Main loop - it is not executed if an error occured during
* initialization
* initialization
*/
*/
while
(
(
!
p_v
dec
->
b_die
)
&&
(
!
p_vdec
->
b_error
)
)
while
(
(
!
p_v
par
->
b_die
)
&&
(
!
p_vpar
->
b_error
)
)
{
{
/* ?? */
/* ?? */
}
}
...
@@ -226,14 +228,14 @@ p_vdec->b_error = 1;
...
@@ -226,14 +228,14 @@ p_vdec->b_error = 1;
/*
/*
* Error loop
* Error loop
*/
*/
if
(
p_v
dec
->
b_error
)
if
(
p_v
par
->
b_error
)
{
{
ErrorThread
(
p_v
dec
);
ErrorThread
(
p_v
par
);
}
}
/* End of thread */
/* End of thread */
EndThread
(
p_v
dec
);
EndThread
(
p_v
par
);
p_v
dec
->
b_run
=
0
;
p_v
par
->
b_run
=
0
;
}
}
/*******************************************************************************
/*******************************************************************************
...
@@ -243,25 +245,25 @@ p_vdec->b_error = 1;
...
@@ -243,25 +245,25 @@ p_vdec->b_error = 1;
* thread can still receive feed, but must be ready to terminate as soon as
* thread can still receive feed, but must be ready to terminate as soon as
* possible.
* possible.
*******************************************************************************/
*******************************************************************************/
static
void
ErrorThread
(
v
dec_thread_t
*
p_vdec
)
static
void
ErrorThread
(
v
par_thread_t
*
p_vpar
)
{
{
/* Wait until a `die' order */
/* Wait until a `die' order */
while
(
!
p_v
dec
->
b_die
)
while
(
!
p_v
par
->
b_die
)
{
{
/* We take the lock, because we are going to read/write the start/end
/* We take the lock, because we are going to read/write the start/end
* indexes of the
decod
er fifo */
* indexes of the
pars
er fifo */
vlc_mutex_lock
(
&
p_v
dec
->
fifo
.
data_lock
);
vlc_mutex_lock
(
&
p_v
par
->
fifo
.
data_lock
);
/* ?? trash all trashable PES packets */
/* ?? trash all trashable PES packets */
while
(
!
DECODER_FIFO_ISEMPTY
(
p_vdec
->
fifo
)
)
while
(
!
PARSER_FIFO_ISEMPTY
(
p_vpar
->
fifo
)
)
{
{
input_NetlistFreePES
(
p_v
dec
->
bit_stream
.
p_input
,
DECODER_FIFO_START
(
p_vdec
->
fifo
)
);
input_NetlistFreePES
(
p_v
par
->
bit_stream
.
p_input
,
PARSER_FIFO_START
(
p_vpar
->
fifo
)
);
DECODER_FIFO_INCSTART
(
p_vdec
->
fifo
);
PARSER_FIFO_INCSTART
(
p_vpar
->
fifo
);
}
}
vlc_mutex_unlock
(
&
p_v
dec
->
fifo
.
data_lock
);
vlc_mutex_unlock
(
&
p_v
par
->
fifo
.
data_lock
);
/* Sleep a while */
/* Sleep a while */
msleep
(
V
DEC
_IDLE_SLEEP
);
msleep
(
V
PAR
_IDLE_SLEEP
);
}
}
}
}
...
@@ -271,9 +273,9 @@ static void ErrorThread( vdec_thread_t *p_vdec )
...
@@ -271,9 +273,9 @@ static void ErrorThread( vdec_thread_t *p_vdec )
* This function is called when the thread ends after a sucessfull
* This function is called when the thread ends after a sucessfull
* initialization.
* initialization.
*******************************************************************************/
*******************************************************************************/
static
void
EndThread
(
v
dec_thread_t
*
p_vdec
)
static
void
EndThread
(
v
par_thread_t
*
p_vpar
)
{
{
intf_DbgMsg
(
"v
dec debug: destroying video decoder thread %p
\n
"
,
p_vdec
);
intf_DbgMsg
(
"v
par debug: destroying video parser thread %p
\n
"
,
p_vpar
);
#ifdef DEBUG
#ifdef DEBUG
/* Check for remaining PES packets */
/* Check for remaining PES packets */
...
@@ -281,8 +283,8 @@ static void EndThread( vdec_thread_t *p_vdec )
...
@@ -281,8 +283,8 @@ static void EndThread( vdec_thread_t *p_vdec )
#endif
#endif
/* Destroy thread structures allocated by InitThread */
/* Destroy thread structures allocated by InitThread */
// vout_DestroyStream( p_v
dec->p_vout, p_vdec
->i_stream );
// vout_DestroyStream( p_v
par->p_vout, p_vpar
->i_stream );
/* ?? */
/* ?? */
intf_DbgMsg
(
"v
dec debug: EndThread(%p)
\n
"
,
p_vdec
);
intf_DbgMsg
(
"v
par debug: EndThread(%p)
\n
"
,
p_vpar
);
}
}
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