{
  "date": "2026-10-13",
  "environment": "FreeConvert API, actual CompressVid job builders, local ffprobe and frame inspection",
  "ffprobe_version": "ffprobe version 8.1.2 Copyright (c) 2007-2026 the FFmpeg developers",
  "source_generation_record": "/blog/evidence/edit-tools-20261013.json",
  "source": {
    "name": "synthetic-10s.mp4",
    "bytes": 10645710,
    "duration_seconds": 10,
    "width": 1920,
    "height": 1080,
    "frame_rate": "30/1",
    "video_codec": "h264",
    "sample_aspect_ratio": "1:1",
    "audio_stream_count": 1,
    "audio_codecs": [
      "aac"
    ],
    "sha256": "e97cd7efa4cc5eadc8f53c03d66510d52ad2027e1f88565d73f0a7a288db1c98"
  },
  "runs": [
    {
      "name": "rotate-90",
      "options": {
        "video_codec": "libx264",
        "video_rate_control_h264": "crf",
        "video_crf_h264": "21",
        "video_encoding_speed_h264_265": "veryfast",
        "video_filter_rotate": "90",
        "video_filter_flip": "no-change"
      },
      "output": {
        "bytes": 7089486,
        "duration_seconds": 10,
        "width": 1080,
        "height": 1920,
        "frame_rate": "30/1",
        "video_codec": "h264",
        "sample_aspect_ratio": "1:1",
        "audio_stream_count": 1,
        "audio_codecs": [
          "aac"
        ],
        "sha256": "29712b09d92ef1ceb622329acea3869bdf8290c7d702b3a38c28ca82085c6fb7"
      }
    },
    {
      "name": "flip-horizontal",
      "options": {
        "video_codec": "libx264",
        "video_rate_control_h264": "crf",
        "video_crf_h264": "21",
        "video_encoding_speed_h264_265": "veryfast",
        "video_filter_rotate": "none",
        "video_filter_flip": "hflip"
      },
      "output": {
        "bytes": 7596798,
        "duration_seconds": 10,
        "width": 1920,
        "height": 1080,
        "frame_rate": "30/1",
        "video_codec": "h264",
        "sample_aspect_ratio": "1:1",
        "audio_stream_count": 1,
        "audio_codecs": [
          "aac"
        ],
        "sha256": "4c192188805476821436552200f449c83fdaac082e119e2c328708022d9ce889"
      }
    },
    {
      "name": "rotate-90-flip-horizontal",
      "options": {
        "video_codec": "libx264",
        "video_rate_control_h264": "crf",
        "video_crf_h264": "21",
        "video_encoding_speed_h264_265": "veryfast",
        "video_filter_rotate": "90",
        "video_filter_flip": "hflip"
      },
      "output": {
        "bytes": 7279665,
        "duration_seconds": 10,
        "width": 1080,
        "height": 1920,
        "frame_rate": "30/1",
        "video_codec": "h264",
        "sample_aspect_ratio": "1:1",
        "audio_stream_count": 1,
        "audio_codecs": [
          "aac"
        ],
        "sha256": "0d036d5db2842247b448cd5958092381a4479b83da667bc0829b905b80ff2ade"
      }
    },
    {
      "name": "gif-small",
      "options": {
        "cut_start_video_to_gif": "00:00:02.00",
        "cut_end_gif": "00:00:05.00",
        "video_custom_width_gif": 320,
        "gif_fps": 10,
        "loop_count_video_to_gif": 0
      },
      "output": {
        "bytes": 223163,
        "duration_seconds": 3,
        "width": 320,
        "height": 180,
        "frame_rate": "10/1",
        "video_codec": "gif",
        "sample_aspect_ratio": "1:1",
        "audio_stream_count": 0,
        "audio_codecs": [],
        "sha256": "6d39c9e51a5b00580471a25b0a1f3b8745e245a91e8939e879ef02ee8f325194"
      },
      "gif_inspection": {
        "frame_count": 30,
        "total_delay_ms": 3000,
        "distinct_frame_delays_ms": [
          100
        ],
        "loop_extension": 0,
        "frames_per_second_over_one_cycle": 10,
        "method": "Pillow frame iteration; sum all Graphic Control Extension delays. Loop 0 means indefinite repeat."
      }
    },
    {
      "name": "gif-balanced",
      "options": {
        "cut_start_video_to_gif": "00:00:02.00",
        "cut_end_gif": "00:00:05.00",
        "video_custom_width_gif": 400,
        "gif_fps": 15,
        "loop_count_video_to_gif": 0
      },
      "output": {
        "bytes": 462578,
        "duration_seconds": 3,
        "width": 400,
        "height": 225,
        "frame_rate": "50/3",
        "video_codec": "gif",
        "sample_aspect_ratio": "1:1",
        "audio_stream_count": 0,
        "audio_codecs": [],
        "sha256": "2c3e917028c475e7854c673f2e2023334d44181914052a9210a1fcb7a9ec80c1"
      },
      "gif_inspection": {
        "frame_count": 45,
        "total_delay_ms": 3000,
        "distinct_frame_delays_ms": [
          60,
          70
        ],
        "loop_extension": 0,
        "frames_per_second_over_one_cycle": 15,
        "method": "Pillow frame iteration; sum all Graphic Control Extension delays. Loop 0 means indefinite repeat."
      }
    },
    {
      "name": "gif-smooth",
      "options": {
        "cut_start_video_to_gif": "00:00:02.00",
        "cut_end_gif": "00:00:05.00",
        "video_custom_width_gif": 480,
        "gif_fps": 20,
        "loop_count_video_to_gif": 0
      },
      "output": {
        "bytes": 821201,
        "duration_seconds": 3,
        "width": 480,
        "height": 270,
        "frame_rate": "20/1",
        "video_codec": "gif",
        "sample_aspect_ratio": "1:1",
        "audio_stream_count": 0,
        "audio_codecs": [],
        "sha256": "bfc44320e71704b27c6decc6f2b56a1197efbd6e3f98ed193ac507dab6c6ca07"
      },
      "gif_inspection": {
        "frame_count": 60,
        "total_delay_ms": 3000,
        "distinct_frame_delays_ms": [
          50
        ],
        "loop_extension": 0,
        "frames_per_second_over_one_cycle": 20,
        "method": "Pillow frame iteration; sum all Graphic Control Extension delays. Loop 0 means indefinite repeat."
      }
    }
  ],
  "limitation": "One synthetic sample per setting. API jobs do not test application billing or physical devices. No quality score, speed ranking or fixed output-size guarantee.",
  "rotation_geometry": [
    {
      "name": "rotate-90",
      "frame_seconds": 2,
      "mean_absolute_rgb_error": 1.1515,
      "method": "Decoded output vs exact spatial permutation of decoded source; threshold <5. Geometry check, not a quality score."
    },
    {
      "name": "flip-horizontal",
      "frame_seconds": 2,
      "mean_absolute_rgb_error": 0.4491,
      "method": "Decoded output vs exact spatial permutation of decoded source; threshold <5. Geometry check, not a quality score."
    },
    {
      "name": "rotate-90-flip-horizontal",
      "frame_seconds": 2,
      "mean_absolute_rgb_error": 1.1499,
      "method": "Decoded output vs exact spatial permutation of decoded source; threshold <5. Geometry check, not a quality score."
    }
  ],
  "combined_filter_order": {
    "observed": "clockwise rotation, then horizontal flip in output coordinates",
    "opposite_order_mean_absolute_rgb_error": 244.942
  },
  "local_recipe_checks": {
    "ffmpeg_version": "ffmpeg version 8.1.2 Copyright (c) 2000-2026 the FFmpeg developers",
    "rotate": {
      "filter": "transpose=clock,hflip",
      "decoded_dimensions": [
        1080,
        1920
      ]
    },
    "gif": {
      "width": 320,
      "height": 180,
      "frame_count": 30,
      "total_delay_ms": 3000,
      "loop_extension": 0,
      "bytes": 250103
    },
    "limitation": "Local palette recipe and hosted provider settings are different pipelines; not a quality or size ranking."
  }
}
