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
55cc60cd
Commit
55cc60cd
authored
Feb 20, 2014
by
Nicolas George
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavu: add thread message API.
parent
58a10e0e
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
281 additions
and
1 deletion
+281
-1
APIchanges
doc/APIchanges
+3
-0
Makefile
libavutil/Makefile
+2
-0
threadmessage.c
libavutil/threadmessage.c
+184
-0
threadmessage.h
libavutil/threadmessage.h
+91
-0
version.h
libavutil/version.h
+1
-1
No files found.
doc/APIchanges
View file @
55cc60cd
...
...
@@ -15,6 +15,9 @@ libavutil: 2012-10-22
API changes, most recent first:
2014-05-26 - xxxxxxx - lavu 52.87.100 - threadmessage.h
Add thread message queue API.
2014-05-26 - c37d179 - lavf 55.41.100 - avformat.h
Add format_probesize to AVFormatContext.
...
...
libavutil/Makefile
View file @
55cc60cd
...
...
@@ -52,6 +52,7 @@ HEADERS = adler32.h \
sha.h
\
sha512.h
\
stereo3d.h
\
threadmessage.h
\
time.h
\
timecode.h
\
timestamp.h
\
...
...
@@ -119,6 +120,7 @@ OBJS = adler32.o \
sha.o
\
sha512.o
\
stereo3d.o
\
threadmessage.o
\
time.o
\
timecode.o
\
tree.o
\
...
...
libavutil/threadmessage.c
0 → 100644
View file @
55cc60cd
/*
* Copyright (c) 2014 Nicolas George
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FFmpeg; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "fifo.h"
#include "threadmessage.h"
#if HAVE_THREADS
#if HAVE_PTHREADS
#include <pthread.h>
#elif HAVE_W32THREADS
#include "compat/w32pthreads.h"
#elif HAVE_OS2THREADS
#include "compat/os2threads.h"
#else
#error "Unknown threads implementation"
#endif
#endif
struct
AVThreadMessageQueue
{
#if HAVE_THREADS
AVFifoBuffer
*
fifo
;
pthread_mutex_t
lock
;
pthread_cond_t
cond
;
int
err_send
;
int
err_recv
;
unsigned
elsize
;
#else
int
dummy
;
#endif
};
int
av_thread_message_queue_alloc
(
AVThreadMessageQueue
**
mq
,
unsigned
nelem
,
unsigned
elsize
)
{
#if HAVE_THREADS
AVThreadMessageQueue
*
rmq
;
int
ret
=
0
;
if
(
nelem
>
INT_MAX
/
elsize
)
return
AVERROR
(
EINVAL
);
if
(
!
(
rmq
=
av_mallocz
(
sizeof
(
*
rmq
))))
return
AVERROR
(
ENOMEM
);
if
((
ret
=
pthread_mutex_init
(
&
rmq
->
lock
,
NULL
)))
{
av_free
(
rmq
);
return
AVERROR
(
ret
);
}
if
((
ret
=
pthread_cond_init
(
&
rmq
->
cond
,
NULL
)))
{
pthread_mutex_destroy
(
&
rmq
->
lock
);
av_free
(
rmq
);
return
AVERROR
(
ret
);
}
if
(
!
(
rmq
->
fifo
=
av_fifo_alloc
(
elsize
*
nelem
)))
{
pthread_cond_destroy
(
&
rmq
->
cond
);
pthread_mutex_destroy
(
&
rmq
->
lock
);
av_free
(
rmq
);
return
AVERROR
(
ret
);
}
rmq
->
elsize
=
elsize
;
*
mq
=
rmq
;
return
0
;
#else
*
mq
=
NULL
;
return
AVERROR
(
ENOSYS
);
#endif
/* HAVE_THREADS */
}
void
av_thread_message_queue_free
(
AVThreadMessageQueue
**
mq
)
{
#if HAVE_THREADS
if
(
*
mq
)
{
av_fifo_freep
(
&
(
*
mq
)
->
fifo
);
pthread_cond_destroy
(
&
(
*
mq
)
->
cond
);
pthread_mutex_destroy
(
&
(
*
mq
)
->
lock
);
av_freep
(
mq
);
}
#endif
}
#if HAVE_THREADS
static
int
av_thread_message_queue_send_locked
(
AVThreadMessageQueue
*
mq
,
void
*
msg
,
unsigned
flags
)
{
while
(
!
mq
->
err_send
&&
av_fifo_space
(
mq
->
fifo
)
<
mq
->
elsize
)
{
if
((
flags
&
AV_THREAD_MESSAGE_NONBLOCK
))
return
AVERROR
(
EAGAIN
);
pthread_cond_wait
(
&
mq
->
cond
,
&
mq
->
lock
);
}
if
(
mq
->
err_send
)
return
mq
->
err_send
;
av_fifo_generic_write
(
mq
->
fifo
,
msg
,
mq
->
elsize
,
NULL
);
pthread_cond_signal
(
&
mq
->
cond
);
return
0
;
}
static
int
av_thread_message_queue_recv_locked
(
AVThreadMessageQueue
*
mq
,
void
*
msg
,
unsigned
flags
)
{
while
(
!
mq
->
err_recv
&&
av_fifo_size
(
mq
->
fifo
)
<
mq
->
elsize
)
{
if
((
flags
&
AV_THREAD_MESSAGE_NONBLOCK
))
return
AVERROR
(
EAGAIN
);
pthread_cond_wait
(
&
mq
->
cond
,
&
mq
->
lock
);
}
if
(
av_fifo_size
(
mq
->
fifo
)
<
mq
->
elsize
)
return
mq
->
err_recv
;
av_fifo_generic_read
(
mq
->
fifo
,
msg
,
mq
->
elsize
,
NULL
);
pthread_cond_signal
(
&
mq
->
cond
);
return
0
;
}
#endif
/* HAVE_THREADS */
int
av_thread_message_queue_send
(
AVThreadMessageQueue
*
mq
,
void
*
msg
,
unsigned
flags
)
{
#if HAVE_THREADS
int
ret
;
pthread_mutex_lock
(
&
mq
->
lock
);
ret
=
av_thread_message_queue_send_locked
(
mq
,
msg
,
flags
);
pthread_mutex_unlock
(
&
mq
->
lock
);
return
ret
;
#else
return
AVERROR
(
ENOSYS
);
#endif
/* HAVE_THREADS */
}
int
av_thread_message_queue_recv
(
AVThreadMessageQueue
*
mq
,
void
*
msg
,
unsigned
flags
)
{
#if HAVE_THREADS
int
ret
;
pthread_mutex_lock
(
&
mq
->
lock
);
ret
=
av_thread_message_queue_recv_locked
(
mq
,
msg
,
flags
);
pthread_mutex_unlock
(
&
mq
->
lock
);
return
ret
;
#else
return
AVERROR
(
ENOSYS
);
#endif
/* HAVE_THREADS */
}
void
av_thread_message_queue_set_err_send
(
AVThreadMessageQueue
*
mq
,
int
err
)
{
#if HAVE_THREADS
pthread_mutex_lock
(
&
mq
->
lock
);
mq
->
err_send
=
err
;
pthread_cond_broadcast
(
&
mq
->
cond
);
pthread_mutex_unlock
(
&
mq
->
lock
);
#endif
/* HAVE_THREADS */
}
void
av_thread_message_queue_set_err_recv
(
AVThreadMessageQueue
*
mq
,
int
err
)
{
#if HAVE_THREADS
pthread_mutex_lock
(
&
mq
->
lock
);
mq
->
err_recv
=
err
;
pthread_cond_broadcast
(
&
mq
->
cond
);
pthread_mutex_unlock
(
&
mq
->
lock
);
#endif
/* HAVE_THREADS */
}
libavutil/threadmessage.h
0 → 100644
View file @
55cc60cd
/*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FFmpeg; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVUTIL_THREADMESSAGE_H
#define AVUTIL_THREADMESSAGE_H
typedef
struct
AVThreadMessageQueue
AVThreadMessageQueue
;
typedef
enum
AVThreadMessageFlags
{
/**
* Perform non-blocking operation.
* If this flag is set, send and recv operations are non-blocking and
* return AVERROR(EAGAIN) immediately if they can not proceed.
*/
AV_THREAD_MESSAGE_NONBLOCK
=
1
,
}
AVThreadMessageFlags
;
/**
* Allocate a new message queue.
*
* @param mq pointer to the message queue
* @param nelem maximum number of elements in the queue
* @param elsize size of each element in the queue
* @return >=0 for success; <0 for error, in particular AVERROR(ENOSYS) if
* lavu was built without thread support
*/
int
av_thread_message_queue_alloc
(
AVThreadMessageQueue
**
mq
,
unsigned
nelem
,
unsigned
elsize
);
/**
* Free a message queue.
*
* The message queue must no longer be in use by another thread.
*/
void
av_thread_message_queue_free
(
AVThreadMessageQueue
**
mq
);
/**
* Send a message on the queue.
*/
int
av_thread_message_queue_send
(
AVThreadMessageQueue
*
mq
,
void
*
msg
,
unsigned
flags
);
/**
* Receive a message from the queue.
*/
int
av_thread_message_queue_recv
(
AVThreadMessageQueue
*
mq
,
void
*
msg
,
unsigned
flags
);
/**
* Set the sending error code.
*
* If the error code is set to non-zero, av_thread_message_queue_recv() will
* return it immediately when there are no longer available messages.
* Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used
* to cause the receiving thread to stop or suspend its operation.
*/
void
av_thread_message_queue_set_err_send
(
AVThreadMessageQueue
*
mq
,
int
err
);
/**
* Set the receiving error code.
*
* If the error code is set to non-zero, av_thread_message_queue_send() will
* return it immediately. Conventional values, such as AVERROR_EOF or
* AVERROR(EAGAIN), can be used to cause the sending thread to stop or
* suspend its operation.
*/
void
av_thread_message_queue_set_err_recv
(
AVThreadMessageQueue
*
mq
,
int
err
);
#endif
/* AVUTIL_THREADMESSAGE_H */
libavutil/version.h
View file @
55cc60cd
...
...
@@ -56,7 +56,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 52
#define LIBAVUTIL_VERSION_MINOR 8
6
#define LIBAVUTIL_VERSION_MINOR 8
7
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
...
...
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