[FFmpeg-devel] [PATCH 1/4] lavf: add probe device API

Lukasz Marek lukasz.m.luki at gmail.com
Sat Jan 25 22:53:59 CET 2014


On 25.11.2013 15:16, Nicolas George wrote:
> Le duodi 22 brumaire, an CCXXII, Lukasz Marek a écrit :
>> Adds new API dedicated for output devices.
>>
>> This API allows to
>> - Test device with provided configuration
>>    Audio devices params:
>>      - device name
>>      - codec
>>      - sample format
>>      - channel count
>>      - channels layout
>>      - sample rate
>>    Video devices params:
>>      - device name
>>      - codec
>>      - pixel format
>>      - width (minimal width as input and real width as output)
>>      - height (minimal height as input and real height as output)
>>
>> - Get all supported configurations matching provided filter.
>>    Filter may contain any subset of Audio/Video device params.
>
> Just a few thought, especially linked to the compatibility of this API and
> the cases I know best, i.e. mostly ALSA.
>
>>
>> Behaviour of probe function can also be modified by flags.
>>
>> Signed-off-by: Lukasz Marek <lukasz.m.luki at gmail.com>
>> ---
>>   libavformat/avformat.h |   97 +++++++++++++++++++++++++++++++++++++++++++++++-
>>   libavformat/utils.c    |   72 +++++++++++++++++++++++++++++++++++
>>   2 files changed, 167 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
>> index 6bd54ce..68b9269 100644
>> --- a/libavformat/avformat.h
>> +++ b/libavformat/avformat.h
>> @@ -323,6 +323,28 @@ typedef struct AVFrac {
>>       int64_t val, num, den;
>>   } AVFrac;
>>
>> +/**
>> + *
>> + */
>> +typedef struct AVDeviceConfig {
>
>> +    struct AVDeviceConfig *next;
>
> Minor: the rest of the API usually returns an array rather than a linked
> list.
>
>> +    char* device_name;                  ///< device name, format depends on device
>> +    char* device_description;           ///< human friendly name
>
> Style, minor: * belongs with the variable name, not the type.
>
>> +    enum AVCodecID codec;               ///< codec
>> +    int format;                         ///< format (AVPixelFormat / AVSampleFormat)
>
>> +    union {
>> +        struct {  // audio parameters
>> +            int sample_rate;            ///< [in]: expected sample rate,   [out]: device's default sample rate
>> +            int channels;               ///< [in]: expected channel count, [out]: device's default channel count
>> +            int64_t channel_layout;     ///< [in]: expected layout,        [out]: device's default layout
>> +        };
>
>> +        struct {  // video parameters
>> +            int width;                  ///< [in]: required width,  [out]: maximum width
>> +            int height;                 ///< [in]: required height, [out]: maximum height
>> +        };
>
> Some kind of frame rate information would probably be useful too.
>
>> +    } stream_info;
>
> IMHO, using an union is not worth the trouble.
>
>> +} AVDeviceConfig;
>
> I find this structure a bit strange: how does it express that the device
> called "default" can support either stereo or 5.1? Or that /dev/video1 can
> accept either RAWVIDEO/yuv420p or MJPEG?
>
> I believe there are two dimensions in this kind of API: first, getting a
> list of valid device names, to propose in GUIs; and, second, for any valid
> device, getting the set of supported parameters.
>
> Note that the first step may fail: for ALSA, the device name can be a
> complex string containing parameters and chained plugins, building a
> complete list is impossible. The same goes for devices that correspond to
> entries in /dev: there is no way of knowing all automatic symlinks
> configured on the system.
>
>> +
>>   /*************************************************/
>>   /* input/output formats */
>>
>> @@ -379,6 +401,14 @@ typedef struct AVProbeData {
>>
>>   #define AVFMT_SEEK_TO_PTS   0x4000000 /**< Seeking is based on PTS */
>>
>> +#define AV_PROBEDEV_DEFAULT_DEV                 0x0001  /**< Probe default device only */
>
>> +#define AV_PROBEDEV_RAW_DATA                    0x0002  /**< Return only raw codecs: AV_CODEC_ID_PCM_*,
>> +                                                                                     AV_CODEC_ID_RAWVIDEO */
>
> What about hwaccel and similar?
>
>> +#define AV_PROBEDEV_ALLOW_STREAM_PARAM_CHANGES  0x0004  /**< Allow modification of wanted stream
>> +                                                             parameteres when provided value is not supported.
>> +                                                             Video devices will update width and height for
>> +                                                             screen resolution. */
>> +
>
> Allowing to request some kind of range would probably be more versatile:
>
>      int width;     ///< preferred width
>      int width_min; ///< minimum possible width
>      int width_max; ///< maximum possible width
>
> Regards,
>

I attached modified version. I has just API definition. I will implement 
it when API is accepted.

-- 
Best Regards,
Lukasz Marek

Royale with Cheese.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-lavd-add-probe-device-API.patch
Type: text/x-patch
Size: 4748 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20140125/a324d661/attachment.bin>


More information about the ffmpeg-devel mailing list