FFmpeg  4.0
Macros | Functions | Variables
dshow.c File Reference
#include "dshow_capture.h"
#include "libavutil/parseutils.h"
#include "libavutil/pixdesc.h"
#include "libavutil/opt.h"
#include "libavformat/internal.h"
#include "libavformat/riff.h"
#include "avdevice.h"
#include "libavcodec/raw.h"
#include "objidl.h"
#include "shlwapi.h"

Go to the source code of this file.

Macros

#define OFFSET(x)   offsetof(struct dshow_ctx, x)
 
#define DEC   AV_OPT_FLAG_DECODING_PARAM
 

Functions

static enum AVPixelFormat dshow_pixfmt (DWORD biCompression, WORD biBitCount)
 
static int dshow_read_close (AVFormatContext *s)
 
static char * dup_wchar_to_utf8 (wchar_t *w)
 
static int shall_we_drop (AVFormatContext *s, int index, enum dshowDeviceType devtype)
 
static void callback (void *priv_data, int index, uint8_t *buf, int buf_size, int64_t time, enum dshowDeviceType devtype)
 
static int dshow_cycle_devices (AVFormatContext *avctx, ICreateDevEnum *devenum, enum dshowDeviceType devtype, enum dshowSourceFilterType sourcetype, IBaseFilter **pfilter, char **device_unique_name)
 Cycle through available devices using the device enumerator devenum, retrieve the device with type specified by devtype and return the pointer to the object found in *pfilter. More...
 
static void dshow_cycle_formats (AVFormatContext *avctx, enum dshowDeviceType devtype, IPin *pin, int *pformat_set)
 Cycle through available formats using the specified pin, try to set parameters specified through AVOptions and if successful return 1 in *pformat_set. More...
 
static int dshow_set_audio_buffer_size (AVFormatContext *avctx, IPin *pin)
 Set audio device buffer size in milliseconds (which can directly impact latency, depending on the device). More...
 
void dshow_show_filter_properties (IBaseFilter *device_filter, AVFormatContext *avctx)
 Pops up a user dialog allowing them to adjust properties for the given filter, if possible. More...
 
static int dshow_cycle_pins (AVFormatContext *avctx, enum dshowDeviceType devtype, enum dshowSourceFilterType sourcetype, IBaseFilter *device_filter, IPin **ppin)
 Cycle through available pins using the device_filter device, of type devtype, retrieve the first output pin and return the pointer to the object found in *ppin. More...
 
static int dshow_list_device_options (AVFormatContext *avctx, ICreateDevEnum *devenum, enum dshowDeviceType devtype, enum dshowSourceFilterType sourcetype)
 List options for device with type devtype, source filter type sourcetype. More...
 
static int dshow_open_device (AVFormatContext *avctx, ICreateDevEnum *devenum, enum dshowDeviceType devtype, enum dshowSourceFilterType sourcetype)
 
static enum AVCodecID waveform_codec_id (enum AVSampleFormat sample_fmt)
 
static enum AVSampleFormat sample_fmt_bits_per_sample (int bits)
 
static int dshow_add_device (AVFormatContext *avctx, enum dshowDeviceType devtype)
 
static int parse_device_name (AVFormatContext *avctx)
 
static int dshow_read_header (AVFormatContext *avctx)
 
static int dshow_check_event_queue (IMediaEvent *media_event)
 Checks media events from DirectShow and returns -1 on error or EOF. More...
 
static int dshow_read_packet (AVFormatContext *s, AVPacket *pkt)
 

Variables

static const AVOption options []
 
static const AVClass dshow_class
 
AVInputFormat ff_dshow_demuxer
 

Macro Definition Documentation

◆ OFFSET

#define OFFSET (   x)    offsetof(struct dshow_ctx, x)

Definition at line 1282 of file dshow.c.

◆ DEC

#define DEC   AV_OPT_FLAG_DECODING_PARAM

Definition at line 1283 of file dshow.c.

Function Documentation

◆ dshow_pixfmt()

static enum AVPixelFormat dshow_pixfmt ( DWORD  biCompression,
WORD  biBitCount 
)
static

Definition at line 34 of file dshow.c.

Referenced by dshow_add_device(), and dshow_cycle_formats().

◆ dshow_read_close()

static int dshow_read_close ( AVFormatContext s)
static

Definition at line 58 of file dshow.c.

Referenced by dshow_read_header().

◆ dup_wchar_to_utf8()

static char* dup_wchar_to_utf8 ( wchar_t *  w)
static

Definition at line 132 of file dshow.c.

Referenced by dshow_cycle_pins().

◆ shall_we_drop()

static int shall_we_drop ( AVFormatContext s,
int  index,
enum dshowDeviceType  devtype 
)
static

Definition at line 142 of file dshow.c.

Referenced by callback().

◆ callback()

static void callback ( void priv_data,
int  index,
uint8_t buf,
int  buf_size,
int64_t  time,
enum dshowDeviceType  devtype 
)
static

◆ dshow_cycle_devices()

static int dshow_cycle_devices ( AVFormatContext avctx,
ICreateDevEnum *  devenum,
enum dshowDeviceType  devtype,
enum dshowSourceFilterType  sourcetype,
IBaseFilter **  pfilter,
char **  device_unique_name 
)
static

Cycle through available devices using the device enumerator devenum, retrieve the device with type specified by devtype and return the pointer to the object found in *pfilter.

If pfilter is NULL, list all device names.

Definition at line 207 of file dshow.c.

Referenced by dshow_list_device_options(), dshow_open_device(), and dshow_read_header().

◆ dshow_cycle_formats()

static void dshow_cycle_formats ( AVFormatContext avctx,
enum dshowDeviceType  devtype,
IPin *  pin,
int pformat_set 
)
static

Cycle through available formats using the specified pin, try to set parameters specified through AVOptions and if successful return 1 in *pformat_set.

If pformat_set is NULL, list all pin capabilities.

Definition at line 321 of file dshow.c.

Referenced by dshow_cycle_pins().

◆ dshow_set_audio_buffer_size()

static int dshow_set_audio_buffer_size ( AVFormatContext avctx,
IPin *  pin 
)
static

Set audio device buffer size in milliseconds (which can directly impact latency, depending on the device).

Definition at line 468 of file dshow.c.

Referenced by dshow_cycle_pins().

◆ dshow_show_filter_properties()

void dshow_show_filter_properties ( IBaseFilter *  device_filter,
AVFormatContext avctx 
)

Pops up a user dialog allowing them to adjust properties for the given filter, if possible.

Definition at line 512 of file dshow.c.

Referenced by dshow_cycle_pins(), and dshow_try_setup_crossbar_options().

◆ dshow_cycle_pins()

static int dshow_cycle_pins ( AVFormatContext avctx,
enum dshowDeviceType  devtype,
enum dshowSourceFilterType  sourcetype,
IBaseFilter *  device_filter,
IPin **  ppin 
)
static

Cycle through available pins using the device_filter device, of type devtype, retrieve the first output pin and return the pointer to the object found in *ppin.

If ppin is NULL, cycle through all pins listing audio/video capabilities.

Definition at line 562 of file dshow.c.

Referenced by dshow_list_device_options(), and dshow_open_device().

◆ dshow_list_device_options()

static int dshow_list_device_options ( AVFormatContext avctx,
ICreateDevEnum *  devenum,
enum dshowDeviceType  devtype,
enum dshowSourceFilterType  sourcetype 
)
static

List options for device with type devtype, source filter type sourcetype.

Parameters
devenumdevice enumerator used for accessing the device

Definition at line 707 of file dshow.c.

Referenced by dshow_read_header().

◆ dshow_open_device()

static int dshow_open_device ( AVFormatContext avctx,
ICreateDevEnum *  devenum,
enum dshowDeviceType  devtype,
enum dshowSourceFilterType  sourcetype 
)
static

Definition at line 725 of file dshow.c.

Referenced by dshow_read_header().

◆ waveform_codec_id()

static enum AVCodecID waveform_codec_id ( enum AVSampleFormat  sample_fmt)
static

Definition at line 914 of file dshow.c.

Referenced by dshow_add_device().

◆ sample_fmt_bits_per_sample()

static enum AVSampleFormat sample_fmt_bits_per_sample ( int  bits)
static

Definition at line 924 of file dshow.c.

Referenced by dshow_add_device().

◆ dshow_add_device()

static int dshow_add_device ( AVFormatContext avctx,
enum dshowDeviceType  devtype 
)
static

Definition at line 935 of file dshow.c.

Referenced by dshow_read_header().

◆ parse_device_name()

static int parse_device_name ( AVFormatContext avctx)
static

Definition at line 1032 of file dshow.c.

Referenced by dshow_read_header().

◆ dshow_read_header()

static int dshow_read_header ( AVFormatContext avctx)
static

Definition at line 1069 of file dshow.c.

◆ dshow_check_event_queue()

static int dshow_check_event_queue ( IMediaEvent *  media_event)
static

Checks media events from DirectShow and returns -1 on error or EOF.

Also purges all events that might be in the event queue to stop the trigger of event notification.

Definition at line 1237 of file dshow.c.

Referenced by dshow_read_packet().

◆ dshow_read_packet()

static int dshow_read_packet ( AVFormatContext s,
AVPacket pkt 
)
static

Definition at line 1252 of file dshow.c.

Variable Documentation

◆ options

const AVOption options[]
static
Initial value:
= {
{ "video_size", "set video size given a string such as 640x480 or hd720.", OFFSET(requested_width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC },
{ "pixel_format", "set video pixel format", OFFSET(pixel_format), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, -1, INT_MAX, DEC },
{ "framerate", "set video frame rate", OFFSET(framerate), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
{ "sample_rate", "set audio sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, DEC },
{ "sample_size", "set audio sample size", OFFSET(sample_size), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 16, DEC },
{ "channels", "set number of audio channels, such as 1 or 2", OFFSET(channels), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, DEC },
{ "audio_buffer_size", "set audio device buffer latency size in milliseconds (default is the device's default)", OFFSET(audio_buffer_size), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, DEC },
{ "list_devices", "list available devices", OFFSET(list_devices), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, DEC },
{ "list_options", "list available options for specified device", OFFSET(list_options), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, DEC },
{ "video_device_number", "set video device number for devices with same name (starts at 0)", OFFSET(video_device_number), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, DEC },
{ "audio_device_number", "set audio device number for devices with same name (starts at 0)", OFFSET(audio_device_number), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, DEC },
{ "video_pin_name", "select video capture pin by name", OFFSET(video_pin_name),AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
{ "audio_pin_name", "select audio capture pin by name", OFFSET(audio_pin_name),AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
{ "crossbar_video_input_pin_number", "set video input pin number for crossbar device", OFFSET(crossbar_video_input_pin_number), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, DEC },
{ "crossbar_audio_input_pin_number", "set audio input pin number for crossbar device", OFFSET(crossbar_audio_input_pin_number), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, DEC },
{ "show_video_device_dialog", "display property dialog for video capture device", OFFSET(show_video_device_dialog), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
{ "show_audio_device_dialog", "display property dialog for audio capture device", OFFSET(show_audio_device_dialog), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
{ "show_video_crossbar_connection_dialog", "display property dialog for crossbar connecting pins filter on video device", OFFSET(show_video_crossbar_connection_dialog), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
{ "show_audio_crossbar_connection_dialog", "display property dialog for crossbar connecting pins filter on audio device", OFFSET(show_audio_crossbar_connection_dialog), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
{ "show_analog_tv_tuner_dialog", "display property dialog for analog tuner filter", OFFSET(show_analog_tv_tuner_dialog), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
{ "show_analog_tv_tuner_audio_dialog", "display property dialog for analog tuner audio filter", OFFSET(show_analog_tv_tuner_audio_dialog), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
{ "audio_device_load", "load audio capture filter device (and properties) from file", OFFSET(audio_filter_load_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
{ "audio_device_save", "save audio capture filter device (and properties) to file", OFFSET(audio_filter_save_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
{ "video_device_load", "load video capture filter device (and properties) from file", OFFSET(video_filter_load_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
{ "video_device_save", "save video capture filter device (and properties) to file", OFFSET(video_filter_save_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
{ NULL },
}
#define NULL
Definition: coverity.c:32
channels
Definition: aptx.c:30
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
Definition: opt.h:276
#define OFFSET(x)
Definition: dshow.c:1282
#define DEC
Definition: dshow.c:1283
sample_rate
offset must point to two consecutive integers
Definition: opt.h:233

Definition at line 1284 of file dshow.c.

◆ dshow_class

const AVClass dshow_class
static
Initial value:
= {
.class_name = "dshow indev",
.item_name = av_default_item_name,
.option = options,
}
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
static const AVOption options[]
Definition: dshow.c:1284

Definition at line 1313 of file dshow.c.

◆ ff_dshow_demuxer

AVInputFormat ff_dshow_demuxer
Initial value:
= {
.name = "dshow",
.long_name = NULL_IF_CONFIG_SMALL("DirectShow capture"),
.priv_data_size = sizeof(struct dshow_ctx),
.read_packet = dshow_read_packet,
.read_close = dshow_read_close,
.flags = AVFMT_NOFILE,
.priv_class = &dshow_class,
}
static int dshow_read_close(AVFormatContext *s)
Definition: dshow.c:58
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
static const AVClass dshow_class
Definition: dshow.c:1313
static int dshow_read_header(AVFormatContext *avctx)
Definition: dshow.c:1069
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:530
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:465
static int dshow_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: dshow.c:1252

Definition at line 1321 of file dshow.c.