Add preliminary ffmpeg plugin (still testing)
- Added some code for FFmpeg output that I'm still playing around with. Right now I'm just trying to get it to output to file and try to understand the FFmpeg/libav APIs. Hopefully in the future this plugin can be used for any sort of output to FFmpeg. - Fixed a cast warning in audio-io.c with size_t -> uint32_t - Renamed the 'video_info' and 'audio_info' structures to 'video_conver_info' and 'audio_convert_info' to better represent their actual purpose, and to avoid confusion with 'audio_output_info' and 'video_output_info' structures. - Removed a few macros from obs-def.h that were at one point going to be used but no longer going to be used (at least for now)
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
#include "audio-io.h"
|
||||
|
||||
struct audio_input {
|
||||
struct audio_info format;
|
||||
struct audio_convert_info conversion;
|
||||
void (*callback)(void *param, const struct audio_data *data);
|
||||
void *param;
|
||||
};
|
||||
@@ -88,13 +88,13 @@ static inline void audio_output_removeline(struct audio_output *audio,
|
||||
audio_line_destroy_data(line);
|
||||
}
|
||||
|
||||
static inline size_t time_to_frames(audio_t audio, uint64_t offset)
|
||||
static inline uint32_t time_to_frames(audio_t audio, uint64_t offset)
|
||||
{
|
||||
double audio_offset_d = (double)offset;
|
||||
audio_offset_d /= 1000000000.0;
|
||||
audio_offset_d *= (double)audio->info.samples_per_sec;
|
||||
|
||||
return (size_t)audio_offset_d;
|
||||
return (uint32_t)audio_offset_d;
|
||||
}
|
||||
|
||||
static inline size_t time_to_bytes(audio_t audio, uint64_t offset)
|
||||
@@ -146,7 +146,7 @@ static inline void mix_audio_line(struct audio_output *audio,
|
||||
}
|
||||
|
||||
static inline void do_audio_output(struct audio_output *audio,
|
||||
uint64_t timestamp, size_t frames)
|
||||
uint64_t timestamp, uint32_t frames)
|
||||
{
|
||||
struct audio_data data;
|
||||
data.data = audio->mix_buffer.array;
|
||||
@@ -168,7 +168,7 @@ static void mix_and_output(struct audio_output *audio, uint64_t audio_time,
|
||||
{
|
||||
struct audio_line *line = audio->first_line;
|
||||
uint64_t time_offset = audio_time - prev_time;
|
||||
size_t frames = time_to_frames(audio, time_offset);
|
||||
uint32_t frames = time_to_frames(audio, time_offset);
|
||||
size_t bytes = frames * audio->block_size;
|
||||
|
||||
da_resize(audio->mix_buffer, bytes);
|
||||
@@ -231,7 +231,8 @@ static size_t audio_get_input_idx(audio_t video,
|
||||
return DARRAY_INVALID;
|
||||
}
|
||||
|
||||
void audio_output_connect(audio_t audio, struct audio_info *format,
|
||||
void audio_output_connect(audio_t audio,
|
||||
struct audio_convert_info *conversion,
|
||||
void (*callback)(void *param, const struct audio_data *data),
|
||||
void *param)
|
||||
{
|
||||
@@ -243,12 +244,12 @@ void audio_output_connect(audio_t audio, struct audio_info *format,
|
||||
input.param = param;
|
||||
|
||||
/* TODO: conversion */
|
||||
if (format) {
|
||||
input.format = *format;
|
||||
if (conversion) {
|
||||
input.conversion = *conversion;
|
||||
} else {
|
||||
input.format.format = audio->info.format;
|
||||
input.format.speakers = audio->info.speakers;
|
||||
input.format.samples_per_sec =
|
||||
input.conversion.format = audio->info.format;
|
||||
input.conversion.speakers = audio->info.speakers;
|
||||
input.conversion.samples_per_sec =
|
||||
audio->info.samples_per_sec;
|
||||
}
|
||||
|
||||
|
@@ -71,7 +71,7 @@ struct audio_output_info {
|
||||
uint64_t buffer_ms;
|
||||
};
|
||||
|
||||
struct audio_info {
|
||||
struct audio_convert_info {
|
||||
uint32_t samples_per_sec;
|
||||
enum audio_format format;
|
||||
enum speaker_layout speakers;
|
||||
@@ -124,7 +124,8 @@ static inline size_t get_audio_size(enum audio_format type,
|
||||
EXPORT int audio_output_open(audio_t *audio, struct audio_output_info *info);
|
||||
EXPORT void audio_output_close(audio_t audio);
|
||||
|
||||
EXPORT void audio_output_connect(audio_t video, struct audio_info *format,
|
||||
EXPORT void audio_output_connect(audio_t video,
|
||||
struct audio_convert_info *conversion,
|
||||
void (*callback)(void *param, const struct audio_data *data),
|
||||
void *param);
|
||||
EXPORT void audio_output_disconnect(audio_t video,
|
||||
|
@@ -17,9 +17,9 @@
|
||||
|
||||
#include "../util/bmem.h"
|
||||
#include "audio-resampler.h"
|
||||
#include <libswresample/swresample.h>
|
||||
#include <libavutil/channel_layout.h>
|
||||
#include <libavutil/opt.h>
|
||||
#include <libavutil/channel_layout.h>
|
||||
#include <libswresample/swresample.h>
|
||||
|
||||
struct audio_resampler {
|
||||
struct SwrContext *context;
|
||||
|
@@ -24,8 +24,8 @@
|
||||
#include "video-io.h"
|
||||
|
||||
struct video_input {
|
||||
struct video_info format;
|
||||
void (*callback)(void *param, struct video_frame *frame);
|
||||
struct video_convert_info conversion;
|
||||
void (*callback)(void *param, const struct video_frame *frame);
|
||||
void *param;
|
||||
};
|
||||
|
||||
@@ -116,7 +116,7 @@ int video_output_open(video_t *video, struct video_output_info *info)
|
||||
out = bmalloc(sizeof(struct video_output));
|
||||
memset(out, 0, sizeof(struct video_output));
|
||||
|
||||
memcpy(&out->info, info, sizeof(struct video_info));
|
||||
memcpy(&out->info, info, sizeof(struct video_output_info));
|
||||
out->frame_time = (uint64_t)(1000000000.0 * (double)info->fps_den /
|
||||
(double)info->fps_num);
|
||||
out->initialized = false;
|
||||
@@ -157,7 +157,7 @@ void video_output_close(video_t video)
|
||||
}
|
||||
|
||||
static size_t video_get_input_idx(video_t video,
|
||||
void (*callback)(void *param, struct video_frame *frame),
|
||||
void (*callback)(void *param, const struct video_frame *frame),
|
||||
void *param)
|
||||
{
|
||||
for (size_t i = 0; i < video->inputs.num; i++) {
|
||||
@@ -169,8 +169,9 @@ static size_t video_get_input_idx(video_t video,
|
||||
return DARRAY_INVALID;
|
||||
}
|
||||
|
||||
void video_output_connect(video_t video, struct video_info *format,
|
||||
void (*callback)(void *param, struct video_frame *frame),
|
||||
void video_output_connect(video_t video,
|
||||
struct video_convert_info *conversion,
|
||||
void (*callback)(void *param, const struct video_frame *frame),
|
||||
void *param)
|
||||
{
|
||||
pthread_mutex_lock(&video->input_mutex);
|
||||
@@ -181,12 +182,18 @@ void video_output_connect(video_t video, struct video_info *format,
|
||||
input.param = param;
|
||||
|
||||
/* TODO: conversion */
|
||||
if (format) {
|
||||
input.format = *format;
|
||||
if (conversion) {
|
||||
input.conversion = *conversion;
|
||||
|
||||
if (input.conversion.width == 0)
|
||||
input.conversion.width = video->info.width;
|
||||
if (input.conversion.height == 0)
|
||||
input.conversion.height = video->info.height;
|
||||
} else {
|
||||
input.format.type = video->info.type;
|
||||
input.format.height = video->info.height;
|
||||
input.format.width = video->info.width;
|
||||
input.conversion.format = video->info.format;
|
||||
input.conversion.width = video->info.width;
|
||||
input.conversion.height = video->info.height;
|
||||
input.conversion.row_align = 1;
|
||||
}
|
||||
|
||||
da_push_back(video->inputs, &input);
|
||||
@@ -196,7 +203,7 @@ void video_output_connect(video_t video, struct video_info *format,
|
||||
}
|
||||
|
||||
void video_output_disconnect(video_t video,
|
||||
void (*callback)(void *param, struct video_frame *frame),
|
||||
void (*callback)(void *param, const struct video_frame *frame),
|
||||
void *param)
|
||||
{
|
||||
pthread_mutex_lock(&video->input_mutex);
|
||||
|
@@ -29,7 +29,7 @@ struct video_output;
|
||||
typedef struct video_output *video_t;
|
||||
|
||||
enum video_format {
|
||||
VIDEO_FORMAT_UNKNOWN,
|
||||
VIDEO_FORMAT_NONE,
|
||||
|
||||
/* planar 420 format */
|
||||
VIDEO_FORMAT_I420, /* three-plane */
|
||||
@@ -57,18 +57,18 @@ struct video_frame {
|
||||
struct video_output_info {
|
||||
const char *name;
|
||||
|
||||
enum video_format type;
|
||||
enum video_format format;
|
||||
uint32_t fps_num;
|
||||
uint32_t fps_den;
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
};
|
||||
|
||||
struct video_info {
|
||||
enum video_format type;
|
||||
struct video_convert_info {
|
||||
enum video_format format;
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
uint32_t row_size; /* if any */
|
||||
uint32_t row_align;
|
||||
};
|
||||
|
||||
#define VIDEO_OUTPUT_SUCCESS 0
|
||||
@@ -78,11 +78,12 @@ struct video_info {
|
||||
EXPORT int video_output_open(video_t *video, struct video_output_info *info);
|
||||
EXPORT void video_output_close(video_t video);
|
||||
|
||||
EXPORT void video_output_connect(video_t video, struct video_info *format,
|
||||
void (*callback)(void *param, struct video_frame *frame),
|
||||
EXPORT void video_output_connect(video_t video,
|
||||
struct video_convert_info *conversion,
|
||||
void (*callback)(void *param, const struct video_frame *frame),
|
||||
void *param);
|
||||
EXPORT void video_output_disconnect(video_t video,
|
||||
void (*callback)(void *param, struct video_frame *frame),
|
||||
void (*callback)(void *param, const struct video_frame *frame),
|
||||
void *param);
|
||||
|
||||
EXPORT const struct video_output_info *video_output_getinfo(video_t video);
|
||||
|
@@ -31,6 +31,3 @@
|
||||
#define SOURCE_ASYNC_VIDEO (1<<2) /* Async video (use with SOURCE_VIDEO) */
|
||||
#define SOURCE_DEFAULT_EFFECT (1<<3) /* Source uses default/filter effect */
|
||||
#define SOURCE_YUV (1<<4) /* Source is in YUV color space */
|
||||
|
||||
#define OUTPUT_VIDEO_ENCODER (1<<0) /* Output requires a video encoder */
|
||||
#define OUTPUT_AUDIO_ENCODER (1<<1) /* Ouptut requires an audio encoder */
|
||||
|
@@ -39,6 +39,7 @@
|
||||
* + myoutput_update
|
||||
* + myoutput_start
|
||||
* + myoutput_stop
|
||||
* + myoutput_active
|
||||
*
|
||||
* [and optionally]
|
||||
* + myoutput_pause
|
||||
|
@@ -404,7 +404,7 @@ static inline enum convert_type get_convert_type(enum video_format format)
|
||||
case VIDEO_FORMAT_UYVY:
|
||||
return CONVERT_422_U;
|
||||
|
||||
case VIDEO_FORMAT_UNKNOWN:
|
||||
case VIDEO_FORMAT_NONE:
|
||||
case VIDEO_FORMAT_YUVX:
|
||||
case VIDEO_FORMAT_UYVX:
|
||||
case VIDEO_FORMAT_RGBA:
|
||||
@@ -427,7 +427,7 @@ static inline bool is_yuv(enum video_format format)
|
||||
case VIDEO_FORMAT_YUVX:
|
||||
case VIDEO_FORMAT_UYVX:
|
||||
return true;
|
||||
case VIDEO_FORMAT_UNKNOWN:
|
||||
case VIDEO_FORMAT_NONE:
|
||||
case VIDEO_FORMAT_RGBA:
|
||||
case VIDEO_FORMAT_BGRA:
|
||||
case VIDEO_FORMAT_BGRX:
|
||||
|
@@ -41,7 +41,7 @@ static inline void make_video_info(struct video_output_info *vi,
|
||||
struct obs_video_info *ovi)
|
||||
{
|
||||
vi->name = "video";
|
||||
vi->type = ovi->output_format;
|
||||
vi->format = ovi->output_format;
|
||||
vi->fps_num = ovi->fps_num;
|
||||
vi->fps_den = ovi->fps_den;
|
||||
vi->width = ovi->output_width;
|
||||
@@ -381,7 +381,7 @@ bool obs_get_video_info(struct obs_video_info *ovi)
|
||||
ovi->base_height = video->base_height;
|
||||
ovi->output_width = info->width;
|
||||
ovi->output_height = info->height;
|
||||
ovi->output_format = info->type;
|
||||
ovi->output_format = info->format;
|
||||
ovi->fps_num = info->fps_num;
|
||||
ovi->fps_den = info->fps_den;
|
||||
|
||||
|
@@ -374,9 +374,6 @@ EXPORT bool obs_source_removed(obs_source_t source);
|
||||
*/
|
||||
EXPORT uint32_t obs_source_get_output_flags(obs_source_t source);
|
||||
|
||||
/** Specifies whether the source can be configured */
|
||||
EXPORT bool obs_source_hasconfig(obs_source_t source);
|
||||
|
||||
/** Updates settings for this source */
|
||||
EXPORT void obs_source_update(obs_source_t source, const char *settings);
|
||||
|
||||
|
Reference in New Issue
Block a user