> ## Documentation Index
> Fetch the complete documentation index at: https://cloudinary.com/documentation/llms.txt
> Use this file to discover all available pages before exploring further.

# Advanced conditional transformations for video


A conditional transformation embeds a transformation directly within a condition in your URL or SDK call, using the format `if_condition/transformation/if_end`. For the basics of this syntax and worked examples, see [Specifying transformations for a condition](using_video_conditional_expressions). For details on the conditions themselves, see [Specifying conditions](video_conditional_expressions).

This page covers advanced techniques: combining multiple conditions with AND/OR logic, and defining fallback transformations using else branches.


## Multiple AND | OR conditions
You can specify multiple conditions to evaluate by joining the conditions with 'AND' or 'OR' conjunction operators.

> **NOTE**: 'AND' operators are evaluated before 'OR' operators.
The example below checks whether the video's aspect ratio is larger than a standard mobile portrait orientation AND if it has a large width. Only in this case, it crops the video to a portrait orientation with a width of 500. If the video already has a portrait orientation (condition 1 is false) or if the original width is less than 500 (condition 2 is false), the conditional transformation is ignored and the video is delivered in its original shape and size.

![Use an AND operator to join 2 conditions](https://res.cloudinary.com/demo/video/upload/if_ar_gt_0.65_and_w_gt_500/ar_0.65,c_fill,w_500/if_end/snow_horses.mp4 "thumb: w_200")

```nodejs
cloudinary.video("snow_horses", {transformation: [
  {if: "ar_gt_0.65_and_w_gt_500"},
  {aspect_ratio: "0.65", width: 500, crop: "fill"},
  {if: "end"}
  ]})
```

```react
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fill } from "@cloudinary/url-gen/actions/resize";

new CloudinaryVideo("snow_horses.mp4").conditional(
  ifCondition(
    "aspect_ratio > 0.65 && width > 500",
    new Transformation().resize(fill().width(500).aspectRatio(0.65))
  )
);
```

```vue
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fill } from "@cloudinary/url-gen/actions/resize";

new CloudinaryVideo("snow_horses.mp4").conditional(
  ifCondition(
    "aspect_ratio > 0.65 && width > 500",
    new Transformation().resize(fill().width(500).aspectRatio(0.65))
  )
);
```

```angular
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fill } from "@cloudinary/url-gen/actions/resize";

new CloudinaryVideo("snow_horses.mp4").conditional(
  ifCondition(
    "aspect_ratio > 0.65 && width > 500",
    new Transformation().resize(fill().width(500).aspectRatio(0.65))
  )
);
```

```js
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fill } from "@cloudinary/url-gen/actions/resize";

new CloudinaryVideo("snow_horses.mp4").conditional(
  ifCondition(
    "aspect_ratio > 0.65 && width > 500",
    new Transformation().resize(fill().width(500).aspectRatio(0.65))
  )
);
```

```python
CloudinaryVideo("snow_horses").video(transformation=[
  {'if': "ar_gt_0.65_and_w_gt_500"},
  {'aspect_ratio': "0.65", 'width': 500, 'crop': "fill"},
  {'if': "end"}
  ])
```

```php
use Cloudinary\Transformation\Conditional;
use Cloudinary\Transformation\Resize;

(new VideoTag('snow_horses.mp4'))
	->conditional(Conditional::ifCondition("aspect_ratio > 0.65 && width > 500",(new Transformation())
	->resize(Resize::fill()->width(500)
->aspectRatio(0.65))));
```

```java
cloudinary.url().transformation(new Transformation()
  .if("ar_gt_0.65_and_w_gt_500").chain()
  .aspectRatio("0.65").width(500).crop("fill").chain()
  .if("end")).videoTag("snow_horses");
```

```ruby
cl_video_tag("snow_horses", transformation: [
  {if: "ar_gt_0.65_and_w_gt_500"},
  {aspect_ratio: "0.65", width: 500, crop: "fill"},
  {if: "end"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .If("ar_gt_0.65_and_w_gt_500").Chain()
  .AspectRatio("0.65").Width(500).Crop("fill").Chain()
  .If("end")).BuildVideoTag("snow_horses")
```

```dart
cloudinary.video('snow_horses.mp4').transformation(Transformation()
	.addTransformation("if_ar_gt_0.65_and_w_gt_500/ar_0.65,c_fill,w_500/if_end"));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setIf("ar_gt_0.65_and_w_gt_500").chain()
  .setAspectRatio("0.65").setWidth(500).setCrop("fill").chain()
  .setIf("end")).generate("snow_horses.mp4")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .if("ar_gt_0.65_and_w_gt_500").chain()
  .aspectRatio("0.65").width(500).crop("fill").chain()
  .if("end")).resourceType("video").generate("snow_horses.mp4");
```

```flutter
cloudinary.video('snow_horses.mp4').transformation(Transformation()
	.addTransformation("if_ar_gt_0.65_and_w_gt_500/ar_0.65,c_fill,w_500/if_end"));
```

```kotlin
cloudinary.video {
	publicId("snow_horses.mp4")
	 addTransformation("if_ar_gt_0.65_and_w_gt_500/ar_0.65,c_fill,w_500/if_end") 
}.generate()
```

```jquery
$.cloudinary.video("snow_horses", {transformation: [
  {if: "ar_gt_0.65_and_w_gt_500"},
  {aspect_ratio: "0.65", width: 500, crop: "fill"},
  {if: "end"}
  ]})
```

```react_native
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fill } from "@cloudinary/url-gen/actions/resize";

new CloudinaryVideo("snow_horses.mp4").conditional(
  ifCondition(
    "aspect_ratio > 0.65 && width > 500",
    new Transformation().resize(fill().width(500).aspectRatio(0.65))
  )
);
```
> **NOTE**: It's also possible to define multiple separate conditions, each with its own transformation result by using multiple `if...end_if` chained components in the URL.
## Else branch transformations
You can specify a transformation that is applied in the case that the initial condition is evaluated as false (and hence the transformations associated with the condition are not applied), by using the `if_else` parameter to specify this fallback transformation.
For example, the following conditional transformation checks whether a video's aspect ratio is close to the desired aspect ratio. If it is close, any necessary padding when the video is resized uses a black background. If the aspect ratio is much smaller (for example, a square or portrait video), a blurred video padding is added instead.

![Else conditions](https://res.cloudinary.com/demo/video/upload/if_ar_gt_1.2/b_black,c_pad,h_320,w_480/if_else/b_blurred:400:15,c_pad,h_320,w_480/if_end/docs/parrot.mp4 "width:480, poster:https://res.cloudinary.com/demo/image/upload/h_320,w_480/docs/parrot_blurred.png")

```nodejs
cloudinary.video("docs/parrot", {transformation: [
  {if: "ar_gt_1.2"},
  {background: "black", height: 320, width: 480, crop: "pad"},
  {if: "else"},
  {background: "blurred:400:15", height: 320, width: 480, crop: "pad"},
  {if: "end"}
  ]})
```

```react
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { pad } from "@cloudinary/url-gen/actions/resize";
import { color, blurred } from "@cloudinary/url-gen/qualifiers/background";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "aspect_ratio > 1.2",
    new Transformation().resize(
      pad().width(480).height(320).background(color("black"))
    )
  ).otherwise(
    new Transformation().resize(
      pad()
        .width(480)
        .height(320)
        .background(blurred().intensity(400).brightness(15))
    )
  )
);
```

```vue
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { pad } from "@cloudinary/url-gen/actions/resize";
import { color, blurred } from "@cloudinary/url-gen/qualifiers/background";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "aspect_ratio > 1.2",
    new Transformation().resize(
      pad().width(480).height(320).background(color("black"))
    )
  ).otherwise(
    new Transformation().resize(
      pad()
        .width(480)
        .height(320)
        .background(blurred().intensity(400).brightness(15))
    )
  )
);
```

```angular
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { pad } from "@cloudinary/url-gen/actions/resize";
import { color, blurred } from "@cloudinary/url-gen/qualifiers/background";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "aspect_ratio > 1.2",
    new Transformation().resize(
      pad().width(480).height(320).background(color("black"))
    )
  ).otherwise(
    new Transformation().resize(
      pad()
        .width(480)
        .height(320)
        .background(blurred().intensity(400).brightness(15))
    )
  )
);
```

```js
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { pad } from "@cloudinary/url-gen/actions/resize";
import { color, blurred } from "@cloudinary/url-gen/qualifiers/background";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "aspect_ratio > 1.2",
    new Transformation().resize(
      pad().width(480).height(320).background(color("black"))
    )
  ).otherwise(
    new Transformation().resize(
      pad()
        .width(480)
        .height(320)
        .background(blurred().intensity(400).brightness(15))
    )
  )
);
```

```python
CloudinaryVideo("docs/parrot").video(transformation=[
  {'if': "ar_gt_1.2"},
  {'background': "black", 'height': 320, 'width': 480, 'crop': "pad"},
  {'if': "else"},
  {'background': "blurred:400:15", 'height': 320, 'width': 480, 'crop': "pad"},
  {'if': "end"}
  ])
```

```php
use Cloudinary\Transformation\Conditional;
use Cloudinary\Transformation\Resize;
use Cloudinary\Transformation\Background;

(new VideoTag('docs/parrot.mp4'))
	->conditional(Conditional::ifCondition("aspect_ratio > 1.2",(new Transformation())
	->resize(Resize::pad()->width(480)
->height(320)
	->background(
	Background::color(Color::BLACK))
	))
	->otherwise((new Transformation())
	->resize(Resize::pad()->width(480)
->height(320)
	->background(
	Background::blurred()->intensity(400)
->brightness(15))
	))
	);
```

```java
cloudinary.url().transformation(new Transformation()
  .if("ar_gt_1.2").chain()
  .background("black").height(320).width(480).crop("pad").chain()
  .if("else").chain()
  .background("blurred:400:15").height(320).width(480).crop("pad").chain()
  .if("end")).videoTag("docs/parrot");
```

```ruby
cl_video_tag("docs/parrot", transformation: [
  {if: "ar_gt_1.2"},
  {background: "black", height: 320, width: 480, crop: "pad"},
  {if: "else"},
  {background: "blurred:400:15", height: 320, width: 480, crop: "pad"},
  {if: "end"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .If("ar_gt_1.2").Chain()
  .Background("black").Height(320).Width(480).Crop("pad").Chain()
  .If("else").Chain()
  .Background("blurred:400:15").Height(320).Width(480).Crop("pad").Chain()
  .If("end")).BuildVideoTag("docs/parrot")
```

```dart
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.addTransformation("if_ar_gt_1.2/b_black,c_pad,h_320,w_480/if_else/b_blurred:400:15,c_pad,h_320,w_480/if_end"));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setIf("ar_gt_1.2").chain()
  .setBackground("black").setHeight(320).setWidth(480).setCrop("pad").chain()
  .setIf("else").chain()
  .setBackground("blurred:400:15").setHeight(320).setWidth(480).setCrop("pad").chain()
  .setIf("end")).generate("docs/parrot.mp4")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .if("ar_gt_1.2").chain()
  .background("black").height(320).width(480).crop("pad").chain()
  .if("else").chain()
  .background("blurred:400:15").height(320).width(480).crop("pad").chain()
  .if("end")).resourceType("video").generate("docs/parrot.mp4");
```

```flutter
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.addTransformation("if_ar_gt_1.2/b_black,c_pad,h_320,w_480/if_else/b_blurred:400:15,c_pad,h_320,w_480/if_end"));
```

```kotlin
cloudinary.video {
	publicId("docs/parrot.mp4")
	 addTransformation("if_ar_gt_1.2/b_black,c_pad,h_320,w_480/if_else/b_blurred:400:15,c_pad,h_320,w_480/if_end") 
}.generate()
```

```jquery
$.cloudinary.video("docs/parrot", {transformation: [
  {if: "ar_gt_1.2"},
  {background: "black", height: 320, width: 480, crop: "pad"},
  {if: "else"},
  {background: "blurred:400:15", height: 320, width: 480, crop: "pad"},
  {if: "end"}
  ]})
```

```react_native
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { pad } from "@cloudinary/url-gen/actions/resize";
import { color, blurred } from "@cloudinary/url-gen/qualifiers/background";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "aspect_ratio > 1.2",
    new Transformation().resize(
      pad().width(480).height(320).background(color("black"))
    )
  ).otherwise(
    new Transformation().resize(
      pad()
        .width(480)
        .height(320)
        .background(blurred().intensity(400).brightness(15))
    )
  )
);
```
In cases where the `if` condition is not in the preceding transformation component, then the `if_else` parameter also acts as an `if_end` parameter: all chained transformation components until the one with `if_else` are only applied if the previous condition holds true. Multiple conditional transformations can also be applied by adding an `if_end` parameter to the last transformation component in the chain, and to avoid ambiguity, the component with the `if_else` parameter should not have additional transformation instructions.
For example, if the video is shorter than or equal to 10 seconds, fade in for one second and fade out for one second. If the video is longer than 10 seconds, fade in for two seconds and fade out for two seconds:

![Multiple else branch conditions](https://res.cloudinary.com/demo/video/upload/if_du_lte_10/e_fade:1000/e_fade:-1000/if_else/e_fade:2000/e_fade:-2000/if_end/docs/parrot.mp4 "thumb: w_200")

```nodejs
cloudinary.video("docs/parrot", {transformation: [
  {if: "du_lte_10"},
  {effect: "fade:1000"},
  {effect: "fade:-1000"},
  {if: "else"},
  {effect: "fade:2000"},
  {effect: "fade:-2000"},
  {if: "end"}
  ]})
```

```react
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fadeIn, fadeOut } from "@cloudinary/url-gen/actions/effect";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "du_lte_10",
    new Transformation()
      .effect(fadeIn().duration(1000))
      .effect(fadeOut().duration(1000))
  ).otherwise(
    new Transformation()
      .effect(fadeIn().duration(2000))
      .effect(fadeOut().duration(2000))
  )
);
```

```vue
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fadeIn, fadeOut } from "@cloudinary/url-gen/actions/effect";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "du_lte_10",
    new Transformation()
      .effect(fadeIn().duration(1000))
      .effect(fadeOut().duration(1000))
  ).otherwise(
    new Transformation()
      .effect(fadeIn().duration(2000))
      .effect(fadeOut().duration(2000))
  )
);
```

```angular
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fadeIn, fadeOut } from "@cloudinary/url-gen/actions/effect";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "du_lte_10",
    new Transformation()
      .effect(fadeIn().duration(1000))
      .effect(fadeOut().duration(1000))
  ).otherwise(
    new Transformation()
      .effect(fadeIn().duration(2000))
      .effect(fadeOut().duration(2000))
  )
);
```

```js
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fadeIn, fadeOut } from "@cloudinary/url-gen/actions/effect";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "du_lte_10",
    new Transformation()
      .effect(fadeIn().duration(1000))
      .effect(fadeOut().duration(1000))
  ).otherwise(
    new Transformation()
      .effect(fadeIn().duration(2000))
      .effect(fadeOut().duration(2000))
  )
);
```

```python
CloudinaryVideo("docs/parrot").video(transformation=[
  {'if': "du_lte_10"},
  {'effect': "fade:1000"},
  {'effect': "fade:-1000"},
  {'if': "else"},
  {'effect': "fade:2000"},
  {'effect': "fade:-2000"},
  {'if': "end"}
  ])
```

```php
use Cloudinary\Transformation\Conditional;
use Cloudinary\Transformation\Effect;

(new VideoTag('docs/parrot.mp4'))
	->conditional(Conditional::ifCondition("du_lte_10",(new Transformation())
	->effect(Effect::fadeIn()->duration(1000))
	->effect(Effect::fadeOut()->duration(1000)))
	->otherwise((new Transformation())
	->effect(Effect::fadeIn()->duration(2000))
	->effect(Effect::fadeOut()->duration(2000)))
	);
```

```java
cloudinary.url().transformation(new Transformation()
  .if("du_lte_10").chain()
  .effect("fade:1000").chain()
  .effect("fade:-1000").chain()
  .if("else").chain()
  .effect("fade:2000").chain()
  .effect("fade:-2000").chain()
  .if("end")).videoTag("docs/parrot");
```

```ruby
cl_video_tag("docs/parrot", transformation: [
  {if: "du_lte_10"},
  {effect: "fade:1000"},
  {effect: "fade:-1000"},
  {if: "else"},
  {effect: "fade:2000"},
  {effect: "fade:-2000"},
  {if: "end"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .If("du_lte_10").Chain()
  .Effect("fade:1000").Chain()
  .Effect("fade:-1000").Chain()
  .If("else").Chain()
  .Effect("fade:2000").Chain()
  .Effect("fade:-2000").Chain()
  .If("end")).BuildVideoTag("docs/parrot")
```

```dart
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.addTransformation("if_du_lte_10/e_fade:1000/e_fade:-1000/if_else/e_fade:2000/e_fade:-2000/if_end"));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setIf("du_lte_10").chain()
  .setEffect("fade:1000").chain()
  .setEffect("fade:-1000").chain()
  .setIf("else").chain()
  .setEffect("fade:2000").chain()
  .setEffect("fade:-2000").chain()
  .setIf("end")).generate("docs/parrot.mp4")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .if("du_lte_10").chain()
  .effect("fade:1000").chain()
  .effect("fade:-1000").chain()
  .if("else").chain()
  .effect("fade:2000").chain()
  .effect("fade:-2000").chain()
  .if("end")).resourceType("video").generate("docs/parrot.mp4");
```

```flutter
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.addTransformation("if_du_lte_10/e_fade:1000/e_fade:-1000/if_else/e_fade:2000/e_fade:-2000/if_end"));
```

```kotlin
cloudinary.video {
	publicId("docs/parrot.mp4")
	 addTransformation("if_du_lte_10/e_fade:1000/e_fade:-1000/if_else/e_fade:2000/e_fade:-2000/if_end") 
}.generate()
```

```jquery
$.cloudinary.video("docs/parrot", {transformation: [
  {if: "du_lte_10"},
  {effect: "fade:1000"},
  {effect: "fade:-1000"},
  {if: "else"},
  {effect: "fade:2000"},
  {effect: "fade:-2000"},
  {if: "end"}
  ]})
```

```react_native
import { ifCondition } from "@cloudinary/url-gen/actions/conditional";
import { fadeIn, fadeOut } from "@cloudinary/url-gen/actions/effect";

new CloudinaryVideo("docs/parrot.mp4").conditional(
  ifCondition(
    "du_lte_10",
    new Transformation()
      .effect(fadeIn().duration(1000))
      .effect(fadeOut().duration(1000))
  ).otherwise(
    new Transformation()
      .effect(fadeIn().duration(2000))
      .effect(fadeOut().duration(2000))
  )
);
```

> **READING**:
>
> * [Specifying conditions](video_conditional_expressions): Learn how to define conditions based on video characteristics, operators, and parameters.

> * [Specifying transformations for a condition](using_video_conditional_expressions): Learn the syntax for applying transformations when a condition is met, including chained transformations and worked examples.
