[FFmpeg-devel] [PATCH] AVFoundation: Add -pixel_format option

sfan5 sfan5 at live.de
Sun May 11 12:34:39 CEST 2014


On 11.05.2014 11:43, Lukasz Marek wrote:
> On 11.05.2014 11:13, sfan5 wrote:
>> +static const struct AVFPixelFormatSpec avf_pixel_formats[] = {
>> +    { AV_PIX_FMT_MONOBLACK, kCVPixelFormatType_1Monochrome },
>> +    { AV_PIX_FMT_GRAY8, kCVPixelFormatType_8Indexed },
>> +    { AV_PIX_FMT_RGB555BE, kCVPixelFormatType_16BE555 },
>> +    { AV_PIX_FMT_RGB555LE, kCVPixelFormatType_16LE555 },
>> +    { AV_PIX_FMT_RGB565BE, kCVPixelFormatType_16BE565 },
>> +    { AV_PIX_FMT_RGB565LE, kCVPixelFormatType_16LE565 },
>> +    { AV_PIX_FMT_RGB0, kCVPixelFormatType_24RGB },
>> +    { AV_PIX_FMT_BGR0, kCVPixelFormatType_24BGR },
>> +    { AV_PIX_FMT_ARGB, kCVPixelFormatType_32ARGB },
>> +    { AV_PIX_FMT_BGRA, kCVPixelFormatType_32BGRA },
>> +    { AV_PIX_FMT_ABGR, kCVPixelFormatType_32ABGR },
>> +    { AV_PIX_FMT_RGBA, kCVPixelFormatType_32RGBA },
>> +    { AV_PIX_FMT_BGR48BE, kCVPixelFormatType_48RGB },
>> +    { AV_PIX_FMT_UYVY422, kCVPixelFormatType_422YpCbCr8 },
>> +    { AV_PIX_FMT_YUVA444P, kCVPixelFormatType_4444YpCbCrA8R },
>> +    { AV_PIX_FMT_YUVA444P16LE, kCVPixelFormatType_4444AYpCbCr16 },
>> +    { AV_PIX_FMT_YUV444P, kCVPixelFormatType_444YpCbCr8 },
>> +    { AV_PIX_FMT_YUV422P16, kCVPixelFormatType_422YpCbCr16 },
>> +    { AV_PIX_FMT_YUV422P10, kCVPixelFormatType_422YpCbCr10 },
>> +    { AV_PIX_FMT_YUV444P10, kCVPixelFormatType_444YpCbCr10 },
>> +    { AV_PIX_FMT_YUV420P, kCVPixelFormatType_420YpCbCr8Planar },
>> +    { AV_PIX_FMT_NV12, 
>> kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange },
>> +    { AV_PIX_FMT_YUYV422, kCVPixelFormatType_422YpCbCr8_yuvs },
>> +    { AV_PIX_FMT_GRAY8, kCVPixelFormatType_OneComponent8 },
>> +    { AV_PIX_FMT_NONE, 0 }
>> +};
>
> GRAY8 is included twice.
>
>>   typedef struct
>>   {
>>       AVClass*        class;
>> @@ -53,8 +86,9 @@ typedef struct
>>       pthread_cond_t  frame_wait_cond;
>>       id              avf_delegate;
>>
>> -    int             list_devices;
>> -    int             video_device_index;
>> +    int                list_devices;
>> +    int                video_device_index;
>
> You should not change not relevant code in single patch.
>
>> +    enum AVPixelFormat pixel_format;
>>
>>       AVCaptureSession         *capture_session;
>>       AVCaptureVideoDataOutput *video_output;
>> @@ -241,7 +275,20 @@ static int avf_read_header(AVFormatContext *s)
>>           goto fail;
>>       }
>>
>> -    NSNumber     *pixel_format = [NSNumber 
>> numberWithUnsignedInt:kCVPixelFormatType_24RGB];
>> +    struct AVFPixelFormatSpec pxl_fmt_spec;
>> +    pxl_fmt_spec.ff_id = AV_PIX_FMT_NONE;
>> +    for(int i = 0; avf_pixel_formats[i].ff_id != AV_PIX_FMT_NONE; 
>> i++) {
>
> minor: space between for and (, the same bellow between ifs and (
>
>> +        if(ctx->pixel_format == avf_pixel_formats[i].ff_id) {
>> +            pxl_fmt_spec = avf_pixel_formats[i];
>> +            break;
>> +        }
>> +    }
>> +    if(pxl_fmt_spec.ff_id == AV_PIX_FMT_NONE) {
>> +        av_log(s, AV_LOG_ERROR, "Selected pixel format not supported 
>> by AVFoundation\n");
>
> Selected pixel format IS not supported
>
>> +        goto fail;
>> +    }
>> +
>> +    NSNumber     *pixel_format = [NSNumber 
>> numberWithUnsignedInt:pxl_fmt_spec.avf_id];
>>       NSDictionary *capture_dict = [NSDictionary 
>> dictionaryWithObject:pixel_format
>> forKey:(id)kCVPixelBufferPixelFormatTypeKey];
>>
>> @@ -285,7 +332,7 @@ static int avf_read_header(AVFormatContext *s)
>>       stream->codec->codec_type = AVMEDIA_TYPE_VIDEO;
>>       stream->codec->width      = (int)image_buffer_size.width;
>>       stream->codec->height     = (int)image_buffer_size.height;
>> -    stream->codec->pix_fmt    = AV_PIX_FMT_RGB24;
>> +    stream->codec->pix_fmt    = pxl_fmt_spec.ff_id;
>>
>>       CFRelease(ctx->current_frame);
>>       ctx->current_frame = nil;
>> @@ -352,6 +399,7 @@ static const AVOption options[] = {
>>       { "true", "", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, 
>> AV_OPT_FLAG_DECODING_PARAM, "list_devices" },
>>       { "false", "", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, 
>> AV_OPT_FLAG_DECODING_PARAM, "list_devices" },
>>       { "video_device_index", "select video device by index for 
>> devices with same name (starts at 0)", offsetof(AVFContext, 
>> video_device_index), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, 
>> AV_OPT_FLAG_DECODING_PARAM },
>> +    { "pixel_format", "Set pixel format", offsetof(AVFContext, 
>> pixel_format), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_RGB24}, 0, 
>> INT_MAX, AV_OPT_FLAG_DECODING_PARAM},
>
> minor: use lower case as for other options.
>
> No more comments from me.
(new patch attached)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-AVFoundation-Add-pixel_format-option.patch
Type: text/x-patch
Size: 5707 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20140511/8f0b4295/attachment.bin>


More information about the ffmpeg-devel mailing list