Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
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
...
@@ -15,6 +15,9 @@ libavutil: 2012-10-22
API changes, most recent first:
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
2014-05-26 - c37d179 - lavf 55.41.100 - avformat.h
Add format_probesize to AVFormatContext.
Add format_probesize to AVFormatContext.
...
...
libavutil/Makefile
View file @
55cc60cd
...
@@ -52,6 +52,7 @@ HEADERS = adler32.h \
...
@@ -52,6 +52,7 @@ HEADERS = adler32.h \
sha.h
\
sha.h
\
sha512.h
\
sha512.h
\
stereo3d.h
\
stereo3d.h
\
threadmessage.h
\
time.h
\
time.h
\
timecode.h
\
timecode.h
\
timestamp.h
\
timestamp.h
\
...
@@ -119,6 +120,7 @@ OBJS = adler32.o \
...
@@ -119,6 +120,7 @@ OBJS = adler32.o \
sha.o
\
sha.o
\
sha512.o
\
sha512.o
\
stereo3d.o
\
stereo3d.o
\
threadmessage.o
\
time.o
\
time.o
\
timecode.o
\
timecode.o
\
tree.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 @@
...
@@ -56,7 +56,7 @@
*/
*/
#define LIBAVUTIL_VERSION_MAJOR 52
#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_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
#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