Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
ef1ccea9
Commit
ef1ccea9
authored
Oct 26, 2014
by
Marton Balint
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ffplay: factorize thread starting and stopping code into decoder
Signed-off-by:
Marton Balint
<
cus@passwd.hu
>
parent
d6910c4b
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
22 additions
and
32 deletions
+22
-32
ffplay.c
ffplay.c
+22
-32
No files found.
ffplay.c
View file @
ef1ccea9
...
...
@@ -191,12 +191,11 @@ typedef struct Decoder {
AVRational
start_pts_tb
;
int64_t
next_pts
;
AVRational
next_pts_tb
;
SDL_Thread
*
decoder_tid
;
}
Decoder
;
typedef
struct
VideoState
{
SDL_Thread
*
read_tid
;
SDL_Thread
*
video_tid
;
SDL_Thread
*
audio_tid
;
AVInputFormat
*
iformat
;
int
abort_request
;
int
force_refresh
;
...
...
@@ -264,7 +263,6 @@ typedef struct VideoState {
int
xpos
;
double
last_vis_time
;
SDL_Thread
*
subtitle_tid
;
int
subtitle_stream
;
AVStream
*
subtitle_st
;
PacketQueue
subtitleq
;
...
...
@@ -769,6 +767,15 @@ static int64_t frame_queue_last_pos(FrameQueue *f)
return
-
1
;
}
static
void
decoder_abort
(
Decoder
*
d
,
FrameQueue
*
fq
)
{
packet_queue_abort
(
d
->
queue
);
frame_queue_signal
(
fq
);
SDL_WaitThread
(
d
->
decoder_tid
,
NULL
);
d
->
decoder_tid
=
NULL
;
packet_queue_flush
(
d
->
queue
);
}
static
inline
void
fill_rectangle
(
SDL_Surface
*
screen
,
int
x
,
int
y
,
int
w
,
int
h
,
int
color
,
int
update
)
{
...
...
@@ -2197,6 +2204,12 @@ static int audio_thread(void *arg)
return
ret
;
}
static
void
decoder_start
(
Decoder
*
d
,
int
(
*
fn
)(
void
*
),
void
*
arg
)
{
packet_queue_start
(
d
->
queue
);
d
->
decoder_tid
=
SDL_CreateThread
(
fn
,
arg
);
}
static
int
video_thread
(
void
*
arg
)
{
VideoState
*
is
=
arg
;
...
...
@@ -2731,31 +2744,28 @@ static int stream_component_open(VideoState *is, int stream_index)
is
->
audio_stream
=
stream_index
;
is
->
audio_st
=
ic
->
streams
[
stream_index
];
packet_queue_start
(
&
is
->
audioq
);
decoder_init
(
&
is
->
auddec
,
avctx
,
&
is
->
audioq
,
is
->
continue_read_thread
);
if
((
is
->
ic
->
iformat
->
flags
&
(
AVFMT_NOBINSEARCH
|
AVFMT_NOGENSEARCH
|
AVFMT_NO_BYTE_SEEK
))
&&
!
is
->
ic
->
iformat
->
read_seek
)
{
is
->
auddec
.
start_pts
=
is
->
audio_st
->
start_time
;
is
->
auddec
.
start_pts_tb
=
is
->
audio_st
->
time_base
;
}
is
->
audio_tid
=
SDL_CreateThread
(
audio_thread
,
is
);
decoder_start
(
&
is
->
auddec
,
audio_thread
,
is
);
SDL_PauseAudio
(
0
);
break
;
case
AVMEDIA_TYPE_VIDEO
:
is
->
video_stream
=
stream_index
;
is
->
video_st
=
ic
->
streams
[
stream_index
];
packet_queue_start
(
&
is
->
videoq
);
decoder_init
(
&
is
->
viddec
,
avctx
,
&
is
->
videoq
,
is
->
continue_read_thread
);
is
->
video_tid
=
SDL_CreateThread
(
video_thread
,
is
);
decoder_start
(
&
is
->
viddec
,
video_thread
,
is
);
is
->
queue_attachments_req
=
1
;
break
;
case
AVMEDIA_TYPE_SUBTITLE
:
is
->
subtitle_stream
=
stream_index
;
is
->
subtitle_st
=
ic
->
streams
[
stream_index
];
packet_queue_start
(
&
is
->
subtitleq
);
decoder_init
(
&
is
->
subdec
,
avctx
,
&
is
->
subtitleq
,
is
->
continue_read_thread
);
is
->
subtitle_tid
=
SDL_CreateThread
(
subtitle_thread
,
is
);
decoder_start
(
&
is
->
subdec
,
subtitle_thread
,
is
);
break
;
default:
break
;
...
...
@@ -2778,13 +2788,9 @@ static void stream_component_close(VideoState *is, int stream_index)
switch
(
avctx
->
codec_type
)
{
case
AVMEDIA_TYPE_AUDIO
:
packet_queue_abort
(
&
is
->
audioq
);
frame_queue_signal
(
&
is
->
sampq
);
decoder_abort
(
&
is
->
auddec
,
&
is
->
sampq
);
SDL_CloseAudio
();
SDL_WaitThread
(
is
->
audio_tid
,
NULL
);
decoder_destroy
(
&
is
->
auddec
);
packet_queue_flush
(
&
is
->
audioq
);
swr_free
(
&
is
->
swr_ctx
);
av_freep
(
&
is
->
audio_buf1
);
is
->
audio_buf1_size
=
0
;
...
...
@@ -2798,28 +2804,12 @@ static void stream_component_close(VideoState *is, int stream_index)
}
break
;
case
AVMEDIA_TYPE_VIDEO
:
packet_queue_abort
(
&
is
->
videoq
);
/* note: we also signal this mutex to make sure we deblock the
video thread in all cases */
frame_queue_signal
(
&
is
->
pictq
);
SDL_WaitThread
(
is
->
video_tid
,
NULL
);
decoder_abort
(
&
is
->
viddec
,
&
is
->
pictq
);
decoder_destroy
(
&
is
->
viddec
);
packet_queue_flush
(
&
is
->
videoq
);
break
;
case
AVMEDIA_TYPE_SUBTITLE
:
packet_queue_abort
(
&
is
->
subtitleq
);
/* note: we also signal this mutex to make sure we deblock the
video thread in all cases */
frame_queue_signal
(
&
is
->
subpq
);
SDL_WaitThread
(
is
->
subtitle_tid
,
NULL
);
decoder_abort
(
&
is
->
subdec
,
&
is
->
subpq
);
decoder_destroy
(
&
is
->
subdec
);
packet_queue_flush
(
&
is
->
subtitleq
);
break
;
default:
break
;
...
...
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