summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/out/ao.c25
-rw-r--r--audio/out/ao.h1
-rw-r--r--audio/out/ao_lavc.c1
-rw-r--r--video/out/vo.c12
-rw-r--r--video/out/vo.h3
-rw-r--r--video/out/vo_lavc.c1
6 files changed, 31 insertions, 12 deletions
diff --git a/audio/out/ao.c b/audio/out/ao.c
index a0faafebfb..9fb201a333 100644
--- a/audio/out/ao.c
+++ b/audio/out/ao.c
@@ -91,13 +91,14 @@ static const struct ao_driver * const audio_out_drivers[] = {
void list_audio_out(void)
{
- int i=0;
mp_tmsg(MSGT_AO, MSGL_INFO, "Available audio output drivers:\n");
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_OUTPUTS\n");
- while (audio_out_drivers[i]) {
- const ao_info_t *info = audio_out_drivers[i++]->info;
- mp_msg(MSGT_GLOBAL, MSGL_INFO, "\t%s\t%s\n", info->short_name,
- info->name);
+ for (int i = 0; audio_out_drivers[i]; i++) {
+ const ao_info_t *info = audio_out_drivers[i]->info;
+ if (!audio_out_drivers[i]->encode) {
+ mp_msg(MSGT_GLOBAL, MSGL_INFO, "\t%s\t%s\n",
+ info->short_name, info->name);
+ }
}
mp_msg(MSGT_GLOBAL, MSGL_INFO,"\n");
}
@@ -110,6 +111,13 @@ struct ao *ao_create(struct MPOpts *opts, struct input_ctx *input)
return r;
}
+static bool ao_try_init(struct ao *ao, char *params)
+{
+ if (ao->driver->encode != !!ao->encode_lavc_ctx)
+ return false;
+ return ao->driver->init(ao, params) >= 0;
+}
+
void ao_init(struct ao *ao, char **ao_list)
{
/* Caller adding child blocks is not supported as we may call
@@ -148,7 +156,7 @@ void ao_init(struct ao *ao, char **ao_list)
if (audio_out) {
// name matches, try it
ao->driver = audio_out;
- if (audio_out->init(ao, params) >= 0) {
+ if (ao_try_init(ao, params)) {
ao->driver = audio_out;
ao->initialized = true;
return;
@@ -167,13 +175,14 @@ void ao_init(struct ao *ao, char **ao_list)
try_defaults:
mp_tmsg(MSGT_AO, MSGL_V, "Trying every known audio driver...\n");
+ ao->probing = false;
+
// now try the rest...
for (int i = 0; audio_out_drivers[i]; i++) {
const struct ao_driver *audio_out = audio_out_drivers[i];
ao->driver = audio_out;
ao->probing = true;
- if (audio_out->init(ao, NULL) >= 0) {
- ao->probing = false;
+ if (ao_try_init(ao, NULL)) {
ao->initialized = true;
ao->driver = audio_out;
return;
diff --git a/audio/out/ao.h b/audio/out/ao.h
index 2fb8d9ba2c..6b79508943 100644
--- a/audio/out/ao.h
+++ b/audio/out/ao.h
@@ -75,6 +75,7 @@ struct ao;
struct ao_driver {
bool is_new;
+ bool encode;
const struct ao_info *info;
const struct ao_old_functions *old_functions;
int (*control)(struct ao *ao, enum aocontrol cmd, void *arg);
diff --git a/audio/out/ao_lavc.c b/audio/out/ao_lavc.c
index ab82ad9d6d..062d1b928b 100644
--- a/audio/out/ao_lavc.c
+++ b/audio/out/ao_lavc.c
@@ -660,6 +660,7 @@ static int play(struct ao *ao, void *data, int len, int flags)
const struct ao_driver audio_out_lavc = {
.is_new = true,
+ .encode = true,
.info = &(const struct ao_info) {
"audio encoding using libavcodec",
"lavc",
diff --git a/video/out/vo.c b/video/out/vo.c
index e2e2d2d675..9a1516930c 100644
--- a/video/out/vo.c
+++ b/video/out/vo.c
@@ -131,6 +131,8 @@ const struct vo_driver *video_out_drivers[] =
static int vo_preinit(struct vo *vo, char *arg)
{
+ if (vo->driver->encode != !!vo->encode_lavc_ctx)
+ return -1;
if (vo->driver->priv_size) {
vo->priv = talloc_zero_size(vo, vo->driver->priv_size);
if (vo->driver->priv_defaults)
@@ -268,12 +270,14 @@ void vo_destroy(struct vo *vo)
void list_video_out(void)
{
- int i = 0;
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Available video output drivers:\n");
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_OUTPUTS\n");
- while (video_out_drivers[i]) {
- const vo_info_t *info = video_out_drivers[i++]->info;
- mp_msg(MSGT_GLOBAL, MSGL_INFO,"\t%s\t%s\n", info->short_name, info->name);
+ for (int i = 0; video_out_drivers[i]; i++) {
+ const vo_info_t *info = video_out_drivers[i]->info;
+ if (!video_out_drivers[i]->encode) {
+ mp_msg(MSGT_GLOBAL, MSGL_INFO,"\t%s\t%s\n",
+ info->short_name, info->name);
+ }
}
mp_msg(MSGT_GLOBAL, MSGL_INFO,"\n");
}
diff --git a/video/out/vo.h b/video/out/vo.h
index 73eb19c8d7..a41b5466fb 100644
--- a/video/out/vo.h
+++ b/video/out/vo.h
@@ -146,6 +146,9 @@ struct vo_driver {
// of pts values itself
bool buffer_frames;
+ // Encoding functionality, which can be invoked via --o only.
+ bool encode;
+
const vo_info_t *info;
/*
* Preinitializes driver (real INITIALIZATION)
diff --git a/video/out/vo_lavc.c b/video/out/vo_lavc.c
index 2aced9351a..2a07a67b0b 100644
--- a/video/out/vo_lavc.c
+++ b/video/out/vo_lavc.c
@@ -514,6 +514,7 @@ static int control(struct vo *vo, uint32_t request, void *data)
const struct vo_driver video_out_lavc = {
.buffer_frames = false,
+ .encode = true,
.info = &(const struct vo_info_s){
"video encoding using libavcodec",
"lavc",