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:
jp9000
2014-01-19 03:16:41 -07:00
parent 8d63845dd4
commit fc8851e9f4
20 changed files with 743 additions and 51 deletions

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 */

View File

@@ -39,6 +39,7 @@
* + myoutput_update
* + myoutput_start
* + myoutput_stop
* + myoutput_active
*
* [and optionally]
* + myoutput_pause

View File

@@ -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:

View File

@@ -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;

View File

@@ -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);