Commit Graph

113 Commits

Author SHA1 Message Date
Andreas Rheinhardt
3d53cefb49 avcodec/raw: Reduce number of avpriv symbols
libavcodec currently exports four avpriv symbols that deal with
PixelFormatTags: avpriv_get_raw_pix_fmt_tags, avpriv_find_pix_fmt,
avpriv_pix_fmt_bps_avi and avpriv_pix_fmt_bps_mov. The latter two are
lists of PixelFormatTags, the former returns such a list and the second
searches a list for a pixel format that matches a given fourcc; only
one of the aforementioned three lists is ever searched.

Yet for avpriv_pix_fmt_bps_avi, avpriv_pix_fmt_bps_mov and
avpriv_find_pix_fmt the overhead of exporting these functions actually
exceeds the size of said objects (at least for ELF; the following numbers
are for x64 Ubuntu 20.10):
The code size of avpriv_find_pix_fmt is small (GCC 10.2 37B, Clang 11 41B),
yet exporting it adds a 20B string for the name alone to the exporting
as well as to each importing library; there is more: Four bytes in the
exporting libraries .gnu.hash; two bytes each for the exporting as well
as each importing libraries .gnu.version; 24B in the exporting as well
as each importing libraries .dynsym; 16B+24B for an entry in .plt as
well as the accompanying relocation entry in .rela.plt for each
importing library.

The overhead for the lists is similar: The strings are 23B and the
.plt+.rela.plt pair is replaced by 8B+24B for an entry in .got and
a relocation entry in .rela.dyn. These lists have a size of 80 resp.
72 bytes.

Yet for ff_raw_pix_fmt_tags, exporting it is advantageous compared to
duplicating it into libavformat and potentially libavdevice. Therefore
this commit replaces all library uses of the four symbols with a single
function that is exported for shared builds. It has an enum parameter
to choose the desired list besides the parameter for the fourcc. New
lists can be supported with new enum values.

Unfortunately, avpriv_get_raw_pix_fmt_tags could not be removed, as the
fourcc2pixfmt tool uses the table of raw pix fmts. No other user of this
function remains.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2022-01-04 13:16:49 +01:00
Diederick Niehorster
e84d8ba441 avdevice/dshow: ensure pin's default format is set
Fixes regression in a1c4929f: there apparently are devices out there
that expose a pin default format that has parameters outside the
capabilities of any of the formats exposed on the pin (sic?). The
VirtualCam plugin (v 2.0.5) of OBS-Studio (v 27.1.3) is such a device.
Now when a default format was found, but not selected when iterating all
formats, fall back to directly setting the default format.

Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2022-01-04 17:41:05 +05:30
Diederick Niehorster
25518f2aa6 avdevice/dshow: only set pin format if wanted
Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2022-01-04 17:41:00 +05:30
Diederick Niehorster
307d2b867f avdevice/dshow: proper cleanup of queried media types
Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2022-01-04 17:40:47 +05:30
James Almer
2497a45562 avdevice/dshow: don't mix declarations and code
Signed-off-by: James Almer <jamrial@gmail.com>
2021-12-24 14:24:07 -03:00
James Almer
c147f7962c avdevice/dshow: remove unused variables
Signed-off-by: James Almer <jamrial@gmail.com>
2021-12-24 14:23:01 -03:00
Diederick Niehorster
a1c4929f65 avdevice/dshow: select format with extended color info
Some DirectShow devices (Logitech C920 webcam) expose each DirectShow
format they support twice, once without and once with extended color
information. During format selection, both match, this patch ensures
that the format with extended color information is selected if it is
available, else it falls back to a matching format without such
information. This also necessitated a new code path taken for default
formats of a device (when user didn't request any specific video size,
etc), because the default format may be one without extended color
information when a twin with extended color information is also
available. Getting the extended color information when available is
important as it allows setting the color space, range, primaries,
transfer characteristics and chroma location of the stream provided by
dshow, enabling users to get more correct color automatically out of
their device.

Closes: #9271

Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2021-12-24 14:07:07 +05:30
Diederick Niehorster
dde92fb7d9 avdevice/dshow: discover source color range/space/etc
Enabled discovering a DirectShow device's color range, space, primaries,
transfer characteristics and chroma location, if the device exposes that
information. Sets them in the stream's codecpars.

Co-authored-by: Valerii Zapodovnikov <val.zapod.vz@gmail.com>
Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2021-12-24 14:07:02 +05:30
Diederick Niehorster
e4b9aee11c avdevice/dshow: add media type info to get_device_list
The list returned by get_device_list now contains info about what media
type(s), if any, can be provided by each device.

Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2021-12-24 14:06:51 +05:30
Diederick Niehorster
54fdbfc366 avdevice/dshow: list_devices: show media type(s) per device
the list_devices option of dshow didn't indicate whether a specific
device provides audio or video output. This patch iterates through all
media formats of all pins exposed by the device to see what types it
provides for capture, and prints this to the console for each device.
Importantly, this now allows to find devices that provide both audio and
video, and devices that provide neither.

Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2021-12-24 14:06:40 +05:30
Diederick Niehorster
ec579b4e36 avdevice/dshow: implement get_device_list
Needed to enable programmatic discovery of DirectShow devices

Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2021-12-24 14:06:33 +05:30
Diederick Niehorster
937de260eb avdevice/dshow: set no-seek flags
avdevice/dshow is a realtime device and as such does not support
seeking. Therefore, its demuxer format should define the
AVFMT_NOBINSEARCH, AVFMT_NOGENSEARCH and AVFMT_NO_BYTE_SEEK flags.
With these flags set, attempting to seek (with, e.g.,
avformat_seek_file()) correctly yields -1 (operation not permitted)
instead of -22 (invalid argument).

This actually seems to apply to many other devices, at least the
gdigrab, v4l2, vfwcap, x11grab, fbdev, kmsgrab and android_camera
devices, from reading the source.

Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2021-12-24 14:06:27 +05:30
Diederick Niehorster
7dc33aad45 avdevice/dshow: implement option to use device video timestamps
The dshow avdevice ignores timestamps for video frames provided by the
DirectShow device, instead using wallclock time, apparently because the
implementer of this code had a device that provided unreliable
timestamps. Me (and others) would like to use the device's timestamps.
The new use_video_device_timestamps option for dshow device enables them
to do so. Since the majority of video devices out there probably provide
fine timestamps, this patch sets the default to using the device
timestamps, which means best fidelity timestamps are used by default.
Using the new option, the user can switch this off and revert to the old
behavior, so a fall back remains available in case the device provides
broken timestamps.

add use_video_device_timestamps to docs.

Closes: #8620

Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2021-12-24 14:06:06 +05:30
Diederick Niehorster
7b21841ce4 avdevice/dshow: prevent NULL access
list_options true would crash when both a video and an audio device were
specified as input. Crash would occur on line 784 because
ctx->device_unique_name[otherDevType] would be NULL

Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
2021-12-24 14:04:14 +05:30
James Almer
b664df3ff4 avdevice/dshow: fix a unused variable warning
Unused if DSHOWDEBUG is not set since commit
d9a9b4c877.

Signed-off-by: James Almer <jamrial@gmail.com>
2021-11-13 11:38:01 -03:00
James Almer
47451d9267 avdevice/dshow: fix print format for some variables
WAVEFORMATEX.nChannels and WAVEFORMATEX.wBitsPerSample are of type WORD, aka
unsigned short.

Signed-off-by: James Almer <jamrial@gmail.com>
2021-11-13 11:38:01 -03:00
Brad Isbell
9d4989f2e1 avdevice/dshow: Fix missing PCM sample size option when it is used as the lone option for DirectShow audio capture
Signed-off-by: Brad Isbell <brad@audiopump.co>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2021-11-05 22:58:43 +01:00
Brad Isbell
d9a9b4c877 avdevice/dshow: Use WAVEFORMATEX from AM_MEDIA_TYPE for describing device capabilities. (Fixes #9420)
Signed-off-by: Brad Isbell <brad@audiopump.co>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2021-11-05 22:58:42 +01:00
Andreas Rheinhardt
d92f38c179 avdevice: Constify all devices
This is possible now that the next-API is gone.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Signed-off-by: James Almer <jamrial@gmail.com>
2021-04-27 11:48:05 -03:00
Andreas Rheinhardt
626535f6a1 avcodec/codec, allcodecs: Constify the AVCodec API
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Signed-off-by: James Almer <jamrial@gmail.com>
2021-04-27 10:43:14 -03:00
James Almer
d422b2ed87 avcodec/packet_internal: make avpriv_packet_list_* functions use an internal struct
The next pointer is kept at the end for backwards compatability until the
major bump, when it should ideally be moved at the front.

Signed-off-by: James Almer <jamrial@gmail.com>
2021-03-17 14:12:17 -03:00
James Almer
911ba8417e avdevice/dshow: Add namespace prefix to the remaining global symbols
Signed-off-by: James Almer <jamrial@gmail.com>
2021-01-25 19:31:11 -03:00
Mark Thompson
c154aada45 lavd/dshow: Add namespace prefix to global functions 2021-01-21 20:02:23 -03:00
Oliver Collyer
bf96937a96 avdevice/dshow: Fixed some minor memory leaks
Signed-off-by: James Almer <jamrial@gmail.com>
2019-01-03 13:15:45 -03:00
Carl Eugen Hoyos
076558a9f4 Cosmetics: Reindent after last commit. 2018-09-19 18:14:40 +02:00
Carl Eugen Hoyos
1ba32a3c46 lavd/dshow: Interpret negative height as bottom-down frame.
Fixes ticket #7436.
2018-09-19 18:13:46 +02:00
Marton Balint
4bb0409820 avdevice: migrate to AVFormatContext->url
Signed-off-by: Marton Balint <cus@passwd.hu>
2018-01-28 23:06:43 +01:00
rogerdpack
bfbffbd7d8 dshow: avoid duplicate NULL check before free
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2016-06-23 03:18:16 +02:00
rogerdpack
9e907c040d dshow: don't add two instances of same device to graphs
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2016-06-23 03:18:16 +02:00
Michael Niedermayer
e7f658be57 avdevice/dshow: Fix frame rate
Fixes: Ticket5526

Tested-by: kgp700

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2016-06-07 02:32:13 +02:00
Derek Buitenhuis
6f69f7a8bf Merge commit '9200514ad8717c63f82101dc394f4378854325bf'
* commit '9200514ad8717c63f82101dc394f4378854325bf':
  lavf: replace AVStream.codec with AVStream.codecpar

This has been a HUGE effort from:
    - Derek Buitenhuis <derek.buitenhuis@gmail.com>
    - Hendrik Leppkes <h.leppkes@gmail.com>
    - wm4 <nfxjfg@googlemail.com>
    - Clément Bœsch <clement@stupeflix.com>
    - James Almer <jamrial@gmail.com>
    - Michael Niedermayer <michael@niedermayer.cc>
    - Rostislav Pehlivanov <atomnuker@gmail.com>

Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2016-04-10 20:59:55 +01:00
FearThe1337
c33ffc7b21 libavdevice/dshow.c: Correct CoGetMalloc check
Current if statement would always be false due to assigning the value of
S_OK which equals 0.

Signed-off-by: FearThe1337 <git@fearthe1337.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2016-02-13 22:57:26 +01:00
Hendrik Leppkes
c2f861ca42 Replace remaining occurances of av_free_packet with av_packet_unref 2015-10-27 14:35:30 +01:00
Clément Bœsch
a68d6cf5b4 avdevice/dshow: use AV_OPT_TYPE_BOOL 2015-09-08 22:39:21 +02:00
Michael Niedermayer
29d147c94d Merge commit '059a934806d61f7af9ab3fd9f74994b838ea5eba'
* commit '059a934806d61f7af9ab3fd9f74994b838ea5eba':
  lavc: Consistently prefix input buffer defines

Conflicts:
	doc/examples/decoding_encoding.c
	libavcodec/4xm.c
	libavcodec/aac_adtstoasc_bsf.c
	libavcodec/aacdec.c
	libavcodec/aacenc.c
	libavcodec/ac3dec.h
	libavcodec/asvenc.c
	libavcodec/avcodec.h
	libavcodec/avpacket.c
	libavcodec/dvdec.c
	libavcodec/ffv1enc.c
	libavcodec/g2meet.c
	libavcodec/gif.c
	libavcodec/h264.c
	libavcodec/h264_mp4toannexb_bsf.c
	libavcodec/huffyuvdec.c
	libavcodec/huffyuvenc.c
	libavcodec/jpeglsenc.c
	libavcodec/libxvid.c
	libavcodec/mdec.c
	libavcodec/motionpixels.c
	libavcodec/mpeg4videodec.c
	libavcodec/mpegvideo.c
	libavcodec/noise_bsf.c
	libavcodec/nuv.c
	libavcodec/nvenc.c
	libavcodec/options.c
	libavcodec/parser.c
	libavcodec/pngenc.c
	libavcodec/proresenc_kostya.c
	libavcodec/qsvdec.c
	libavcodec/svq1enc.c
	libavcodec/tiffenc.c
	libavcodec/truemotion2.c
	libavcodec/utils.c
	libavcodec/utvideoenc.c
	libavcodec/vc1dec.c
	libavcodec/wmalosslessdec.c
	libavformat/adxdec.c
	libavformat/aiffdec.c
	libavformat/apc.c
	libavformat/apetag.c
	libavformat/avidec.c
	libavformat/bink.c
	libavformat/cafdec.c
	libavformat/flvdec.c
	libavformat/id3v2.c
	libavformat/isom.c
	libavformat/matroskadec.c
	libavformat/mov.c
	libavformat/mpc.c
	libavformat/mpc8.c
	libavformat/mpegts.c
	libavformat/mvi.c
	libavformat/mxfdec.c
	libavformat/mxg.c
	libavformat/nutdec.c
	libavformat/oggdec.c
	libavformat/oggparsecelt.c
	libavformat/oggparseflac.c
	libavformat/oggparseopus.c
	libavformat/oggparsespeex.c
	libavformat/omadec.c
	libavformat/rawdec.c
	libavformat/riffdec.c
	libavformat/rl2.c
	libavformat/rmdec.c
	libavformat/rtpdec_latm.c
	libavformat/rtpdec_mpeg4.c
	libavformat/rtpdec_qdm2.c
	libavformat/rtpdec_svq3.c
	libavformat/sierravmd.c
	libavformat/smacker.c
	libavformat/smush.c
	libavformat/spdifenc.c
	libavformat/takdec.c
	libavformat/tta.c
	libavformat/utils.c
	libavformat/vqf.c
	libavformat/westwood_vqa.c
	libavformat/xmv.c
	libavformat/xwma.c
	libavformat/yop.c

Merged-by: Michael Niedermayer <michael@niedermayer.cc>
2015-07-27 23:15:19 +02:00
Mate Sebok
4d98015dcf dshow: add capture device save and load
Signed-off-by: Mate Sebok <smfinc.org@gmail.com>
Reviewed-by: Roger Pack <rogerdpack2@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2015-04-22 20:12:36 +02:00
rogerdpack
61974c7dcc dshow: tweak logging
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
2015-01-26 02:04:30 -07:00
rogerdpack
7c2e262701 dshow: crossbar dialog was frequently being displayed twice, split up option so it can be just once
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
2015-01-26 01:29:58 -07:00
rogerdpack
c55fa2f09b dshow: add properties dialog for tv tuners
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
2015-01-26 00:28:26 -07:00
rogerdpack
a35da0920d dshow: some devices only list themselves under "Video sources" but
actually have both video and audio output pins, so make the audio pins
accessible by video source name.

Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
2015-01-23 06:54:48 -07:00
rogerdpack
5d72cf0f64 dshow: add options for allowing filter popup configuration dialogs to be presented to the user
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
2015-01-23 06:49:37 -07:00
rogerdpack
ec81ad21c1 dshow: introduce support for crossbar [multiple input selectable] devices
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
2015-01-23 06:35:16 -07:00
rogerdpack
8eb5b5ec6f dshow: use non deprecated api
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
2015-01-23 06:07:24 -07:00
rogerdpack
e620eee88c dshow: miscellaneous tweaks
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
2015-01-23 06:01:32 -07:00
rogerdpack
d01234419b dshow: allow selecting devices by an alternative name (workaround for devices with symbols in them), allow specifying capture pins by name and alternative (unique) name
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
2015-01-23 05:38:14 -07:00
Michael Niedermayer
9c3a8693a2 avdevice/dshow: Remove unneeded NULL checks
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-12-28 18:17:12 +01:00
Michael Niedermayer
a3f6e8c4d9 avdevice/dshow: Use av_freep() to avoid leaving stale pointers in memory
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-12-28 18:16:37 +01:00
Michael Niedermayer
60420fa3dc avdevice/dshow: fix build, ensure that feature enable #defines are set before includes
dshow_capture.h sets up various flags before including windows headers
this must occur before other headers (like os_support.h) include these
headers without the setup

This could be fixed differently but for now this fixes building on mingw

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-11-25 04:02:48 +01:00
James Almer
1fd880cef3 lavd/dshow: use av_codec_get_id()
ff_codec_get_id() is a lavf internal function

Signed-off-by: James Almer <jamrial@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-08-07 13:03:17 +02:00
James Almer
0ab00a75e4 avcodec/raw: add avpriv_get_raw_pix_fmt_tags()
Used to expose ff_raw_pix_fmt_tags[] to other libav* libraries

Signed-off-by: James Almer <jamrial@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-08-07 12:52:38 +02:00