Make it easy to add new extra mfx parameter buffer. No functional change.
Unified · Split
| @@ -365,53 +365,44 @@ static int config_output(AVFilterLink *outlink) · 364 unmodified lines | |||
| 365 | param.crop = &crop; | 365 | param.crop = &crop; |
| 366 | } | 366 | } |
| 367 | 367 | ||
| 368 | if (vpp->deinterlace) { | 368 | #define INIT_MFX_EXTBUF(extbuf, id) do { \ |
| 369 | memset(&vpp->deinterlace_conf, 0, sizeof(mfxExtVPPDeinterlacing)); | 369 | memset(&vpp->extbuf, 0, sizeof(vpp->extbuf)); \ |
| 370 | vpp->deinterlace_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING; | 370 | vpp->extbuf.Header.BufferId = id; \ |
| 371 | vpp->deinterlace_conf.Header.BufferSz = sizeof(mfxExtVPPDeinterlacing); | 371 | vpp->extbuf.Header.BufferSz = sizeof(vpp->extbuf); \ |
| 372 | vpp->deinterlace_conf.Mode = vpp->deinterlace == 1 ? | 372 | param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->extbuf; \ |
| 373 | MFX_DEINTERLACING_BOB : MFX_DEINTERLACING_ADVANCED; | 373 | } while (0) |
| 374 | |||
| 375 | #define SET_MFX_PARAM_FIELD(extbuf, field, value) do { \ | ||
| 376 | vpp->extbuf.field = value; \ | ||
| 377 | } while (0) | ||
| 374 | 378 | ||
| 375 | param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->deinterlace_conf; | 379 | if (vpp->deinterlace) { |
| 380 | INIT_MFX_EXTBUF(deinterlace_conf, MFX_EXTBUFF_VPP_DEINTERLACING); | ||
| 381 | SET_MFX_PARAM_FIELD(deinterlace_conf, Mode, (vpp->deinterlace == 1 ? | ||
| 382 | MFX_DEINTERLACING_BOB : MFX_DEINTERLACING_ADVANCED)); | ||
| 376 | } | 383 | } |
| 377 | 384 | ||
| 378 | if (vpp->use_frc) { | 385 | if (vpp->use_frc) { |
| 379 | memset(&vpp->frc_conf, 0, sizeof(mfxExtVPPFrameRateConversion)); | 386 | INIT_MFX_EXTBUF(frc_conf, MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION); |
| 380 | vpp->frc_conf.Header.BufferId = MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION; | 387 | SET_MFX_PARAM_FIELD(frc_conf, Algorithm, MFX_FRCALGM_DISTRIBUTED_TIMESTAMP); |
| 381 | vpp->frc_conf.Header.BufferSz = sizeof(mfxExtVPPFrameRateConversion); | ||
| 382 | vpp->frc_conf.Algorithm = MFX_FRCALGM_DISTRIBUTED_TIMESTAMP; | ||
| 383 | |||
| 384 | param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->frc_conf; | ||
| 385 | } | 388 | } |
| 386 | 389 | ||
| 387 | if (vpp->denoise) { | 390 | if (vpp->denoise) { |
| 388 | memset(&vpp->denoise_conf, 0, sizeof(mfxExtVPPDenoise)); | 391 | INIT_MFX_EXTBUF(denoise_conf, MFX_EXTBUFF_VPP_DENOISE); |
| 389 | vpp->denoise_conf.Header.BufferId = MFX_EXTBUFF_VPP_DENOISE; | 392 | SET_MFX_PARAM_FIELD(denoise_conf, DenoiseFactor, vpp->denoise); |
| 390 | vpp->denoise_conf.Header.BufferSz = sizeof(mfxExtVPPDenoise); | ||
| 391 | vpp->denoise_conf.DenoiseFactor = vpp->denoise; | ||
| 392 | |||
| 393 | param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->denoise_conf; | ||
| 394 | } | 393 | } |
| 395 | 394 | ||
| 396 | if (vpp->detail) { | 395 | if (vpp->detail) { |
| 397 | memset(&vpp->detail_conf, 0, sizeof(mfxExtVPPDetail)); | 396 | INIT_MFX_EXTBUF(detail_conf, MFX_EXTBUFF_VPP_DETAIL); |
| 398 | vpp->detail_conf.Header.BufferId = MFX_EXTBUFF_VPP_DETAIL; | 397 | SET_MFX_PARAM_FIELD(detail_conf, DetailFactor, vpp->detail); |
| 399 | vpp->detail_conf.Header.BufferSz = sizeof(mfxExtVPPDetail); | ||
| 400 | vpp->detail_conf.DetailFactor = vpp->detail; | ||
| 401 | |||
| 402 | param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->detail_conf; | ||
| 403 | } | 398 | } |
| 404 | 399 | ||
| 405 | if (vpp->procamp) { | 400 | if (vpp->procamp) { |
| 406 | memset(&vpp->procamp_conf, 0, sizeof(mfxExtVPPProcAmp)); | 401 | INIT_MFX_EXTBUF(procamp_conf, MFX_EXTBUFF_VPP_PROCAMP); |
| 407 | vpp->procamp_conf.Header.BufferId = MFX_EXTBUFF_VPP_PROCAMP; | 402 | SET_MFX_PARAM_FIELD(procamp_conf, Hue, vpp->hue); |
| 408 | vpp->procamp_conf.Header.BufferSz = sizeof(mfxExtVPPProcAmp); | 403 | SET_MFX_PARAM_FIELD(procamp_conf, Saturation, vpp->saturation); |
| 409 | vpp->procamp_conf.Hue = vpp->hue; | 404 | SET_MFX_PARAM_FIELD(procamp_conf, Contrast, vpp->contrast); |
| 410 | vpp->procamp_conf.Saturation = vpp->saturation; | 405 | SET_MFX_PARAM_FIELD(procamp_conf, Brightness, vpp->brightness); |
| 411 | vpp->procamp_conf.Contrast = vpp->contrast; | ||
| 412 | vpp->procamp_conf.Brightness = vpp->brightness; | ||
| 413 | |||
| 414 | param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->procamp_conf; | ||
| 415 | } | 406 | } |
| 416 | 407 | ||
| 417 | if (vpp->transpose >= 0) { | 408 | if (vpp->transpose >= 0) { |
| @@ -458,18 +449,14 @@ static int config_output(AVFilterLink *outlink) · 40 unmodified lines | |||
| 458 | 449 | ||
| 459 | if (vpp->rotate) { | 450 | if (vpp->rotate) { |
| 460 | if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 17)) { | 451 | if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 17)) { |
| 461 | memset(&vpp->rotation_conf, 0, sizeof(mfxExtVPPRotation)); | 452 | INIT_MFX_EXTBUF(rotation_conf, MFX_EXTBUFF_VPP_ROTATION); |
| 462 | vpp->rotation_conf.Header.BufferId = MFX_EXTBUFF_VPP_ROTATION; | 453 | SET_MFX_PARAM_FIELD(rotation_conf, Angle, vpp->rotate); |
| 463 | vpp->rotation_conf.Header.BufferSz = sizeof(mfxExtVPPRotation); | ||
| 464 | vpp->rotation_conf.Angle = vpp->rotate; | ||
| 465 | 454 | ||
| 466 | if (MFX_ANGLE_90 == vpp->rotate || MFX_ANGLE_270 == vpp->rotate) { | 455 | if (MFX_ANGLE_90 == vpp->rotate || MFX_ANGLE_270 == vpp->rotate) { |
| 467 | FFSWAP(int, vpp->out_width, vpp->out_height); | 456 | FFSWAP(int, vpp->out_width, vpp->out_height); |
| 468 | FFSWAP(int, outlink->w, outlink->h); | 457 | FFSWAP(int, outlink->w, outlink->h); |
| 469 | av_log(ctx, AV_LOG_DEBUG, "Swap width and height for clock/cclock rotation.\n"); | 458 | av_log(ctx, AV_LOG_DEBUG, "Swap width and height for clock/cclock rotation.\n"); |
| 470 | } | 459 | } |
| 471 | |||
| 472 | param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->rotation_conf; | ||
| 473 | } else { | 460 | } else { |
| 474 | av_log(ctx, AV_LOG_WARNING, "The QSV VPP rotate option is " | 461 | av_log(ctx, AV_LOG_WARNING, "The QSV VPP rotate option is " |
| 475 | "not supported with this MSDK version.\n"); | 462 | "not supported with this MSDK version.\n"); |
| @@ -479,12 +466,8 @@ static int config_output(AVFilterLink *outlink) · 3 unmodified lines | |||
| 479 | 466 | ||
| 480 | if (vpp->hflip) { | 467 | if (vpp->hflip) { |
| 481 | if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) { | 468 | if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) { |
| 482 | memset(&vpp->mirroring_conf, 0, sizeof(mfxExtVPPMirroring)); | 469 | INIT_MFX_EXTBUF(mirroring_conf, MFX_EXTBUFF_VPP_MIRRORING); |
| 483 | vpp->mirroring_conf.Header.BufferId = MFX_EXTBUFF_VPP_MIRRORING; | 470 | SET_MFX_PARAM_FIELD(mirroring_conf, Type, vpp->hflip); |
| 484 | vpp->mirroring_conf.Header.BufferSz = sizeof(mfxExtVPPMirroring); | ||
| 485 | vpp->mirroring_conf.Type = vpp->hflip; | ||
| 486 | |||
| 487 | param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->mirroring_conf; | ||
| 488 | } else { | 471 | } else { |
| 489 | av_log(ctx, AV_LOG_WARNING, "The QSV VPP hflip option is " | 472 | av_log(ctx, AV_LOG_WARNING, "The QSV VPP hflip option is " |
| 490 | "not supported with this MSDK version.\n"); | 473 | "not supported with this MSDK version.\n"); |
| @@ -494,17 +477,16 @@ static int config_output(AVFilterLink *outlink) · 3 unmodified lines | |||
| 494 | 477 | ||
| 495 | if (inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format) { | 478 | if (inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format) { |
| 496 | if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) { | 479 | if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) { |
| 497 | memset(&vpp->scale_conf, 0, sizeof(mfxExtVPPScaling)); | 480 | INIT_MFX_EXTBUF(scale_conf, MFX_EXTBUFF_VPP_SCALING); |
| 498 | vpp->scale_conf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; | 481 | SET_MFX_PARAM_FIELD(scale_conf, ScalingMode, vpp->scale_mode); |
| 499 | vpp->scale_conf.Header.BufferSz = sizeof(mfxExtVPPScaling); | ||
| 500 | vpp->scale_conf.ScalingMode = vpp->scale_mode; | ||
| 501 | |||
| 502 | param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->scale_conf; | ||
| 503 | } else | 482 | } else |
| 504 | av_log(ctx, AV_LOG_WARNING, "The QSV VPP Scale & format conversion " | 483 | av_log(ctx, AV_LOG_WARNING, "The QSV VPP Scale & format conversion " |
| 505 | "option is not supported with this MSDK version.\n"); | 484 | "option is not supported with this MSDK version.\n"); |
| 506 | } | 485 | } |
| 507 | 486 | ||
| 487 | #undef INIT_MFX_EXTBUF | ||
| 488 | #undef SET_MFX_PARAM_FIELD | ||
| 489 | |||
| 508 | if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise || | 490 | if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise || |
| 509 | vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip || | 491 | vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip || |
| 510 | inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format) | 492 | inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format) |