[FFmpeg-devel] [PATCH 6/6] lavf: add avpriv function to register devices
Josh de Kock
josh at itanimul.li
Wed Jan 3 02:43:12 EET 2018
---
libavdevice/alldevices.c | 6 +++++-
libavformat/allformats.c | 44 +++++++++++++++++++++++++++++++++++++++-----
libavformat/avformat.h | 4 ++++
3 files changed, 48 insertions(+), 6 deletions(-)
diff --git a/libavdevice/alldevices.c b/libavdevice/alldevices.c
index 6b2a512..041eb85 100644
--- a/libavdevice/alldevices.c
+++ b/libavdevice/alldevices.c
@@ -105,6 +105,8 @@ static void av_device_init_next(void)
}
if (previn)
previn->next = NULL;
+
+ avpriv_register_devices(outdev_list, indev_list);
}
void avdevice_register_all(void)
@@ -115,9 +117,11 @@ void avdevice_register_all(void)
static void *device_next(void *prev, int output,
AVClassCategory c1, AVClassCategory c2)
{
- pthread_once(&av_device_next_init, av_device_init_next);
const AVClass *pc;
AVClassCategory category = AV_CLASS_CATEGORY_NA;
+
+ pthread_once(&av_device_next_init, av_device_init_next);
+
if (!prev && !(prev = (output ? (void*)outdev_list[0] : (void*)indev_list[0])))
return NULL;
diff --git a/libavformat/allformats.c b/libavformat/allformats.c
index fa72acd..52b7088 100644
--- a/libavformat/allformats.c
+++ b/libavformat/allformats.c
@@ -20,6 +20,7 @@
*/
#include "libavutil/thread.h"
+#include "libavdevice/avdevice.h"
#include "avformat.h"
#include "rtp.h"
#include "rdt.h"
@@ -482,6 +483,7 @@ const AVOutputFormat *av_muxer_iterate(void **opaque)
{
uintptr_t i = (uintptr_t)*opaque;
const AVOutputFormat *f = muxer_list[i];
+
if (f)
*opaque = (void*)(i + 1);
return f;
@@ -499,45 +501,77 @@ const AVInputFormat *av_demuxer_iterate(void **opaque){
#if FF_API_NEXT
pthread_once_t av_format_next_init = PTHREAD_ONCE_INIT;
+static AVInputFormat **indev_list = NULL;
+static AVOutputFormat **outdev_list = NULL;
+
static void av_format_init_next(void)
{
AVOutputFormat *prevout = NULL, *out;
AVInputFormat *previn = NULL, *in;
void *i = 0;
- while ((out = (AVOutputFormat*)av_muxer_iterate(&i))) {
+
+ for (i = 0; (out = (AVOutputFormat*)av_muxer_iterate(&i));) {
if (prevout)
prevout->next = out;
prevout = out;
}
+
+ if (outdev_list) {
+ for (i = 0; (out = (AVOutputFormat*)outdev_list[(int)i]); i = (void*)(i + 1)) {
+ if (prevout)
+ prevout->next = out;
+ prevout = out;
+ }
+ }
+
if (prevout)
prevout->next = NULL;
- i = 0;
- while ((in = (AVInputFormat*)av_demuxer_iterate(&i))) {
+ for (i = 0; (in = (AVInputFormat*)av_demuxer_iterate(&i));) {
if (previn)
previn->next = in;
previn = in;
}
+
+ if (indev_list) {
+ for (i = 0; (in = (AVInputFormat*)indev_list[(int)i]); i = (void*)(i + 1)) {
+ if (previn)
+ previn->next = in;
+ previn = in;
+ }
+ }
+
if (previn)
previn->next = NULL;
}
+void avpriv_register_devices(AVOutputFormat *o[], AVInputFormat *i[])
+{
+ outdev_list = o;
+ indev_list = i;
+ av_format_init_next();
+}
+
AVInputFormat *av_iformat_next(const AVInputFormat *f)
{
+ void *i = 0;
pthread_once(&av_format_next_init, av_format_init_next);
if (f)
return f->next;
else
- return demuxer_list[0];
+ /* If there are no demuxers but input devices, then return the first input device.
+ * This will still return null if both there are both no demuxers or input devices. */
+ return demuxer_list[0] ? (AVInputFormat*)demuxer_list[0] : (AVInputFormat*)av_indev_iterate(&i);
}
AVOutputFormat *av_oformat_next(const AVOutputFormat *f)
{
+ void *i = 0;
pthread_once(&av_format_next_init, av_format_init_next);
if (f)
return f->next;
else
- return muxer_list[0];
+ return muxer_list[0] ? (AVOutputFormat*)muxer_list[0] : (AVOutputFormat*)av_outdev_iterate(&i);
}
void av_register_all(void)
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index d38ca4e..56ec41a 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -2014,6 +2014,10 @@ int avformat_network_deinit(void);
#if FF_API_NEXT
/**
+ * Register devices in deprecated format linked list.
+ */
+void avpriv_register_devices(AVOutputFormat *o[], AVInputFormat *i[]);
+/**
* If f is NULL, returns the first registered input format,
* if f is non-NULL, returns the next registered input format after f
* or NULL if f is the last one.
--
2.7.4
More information about the ffmpeg-devel
mailing list