{
  "schema_version": "1.0",
  "engine": {
    "name": "OpenCV",
    "version": "5.0.0"
  },
  "mode": "aws-analysis",
  "cloud_status": "deployed",
  "source": {
    "name": "1132500e824d467eade16ae54680c879.mp4",
    "sha256": "5c2338d87557fc1f4093f08fb966b9864235c3b0ae09f2c1c8f04d233f540552",
    "width": 720,
    "height": 1280,
    "fps": 24.0,
    "frames": 288,
    "duration": 12.0
  },
  "config": {
    "blur_laplacian": 65.0,
    "blur_fft": 0.012,
    "black_mean": 9.0,
    "black_fraction": 0.96,
    "dark_mean": 43.0,
    "freeze_diff": 0.65,
    "freeze_seconds": 0.6,
    "cut_diff": 32.0,
    "cut_ssim": 0.48,
    "flicker_delta": 22.0,
    "flicker_structure_diff": 12.0,
    "min_issue_seconds": 0.16,
    "text_interval": 0.5,
    "safe_left": 0.05,
    "safe_right": 0.82,
    "safe_top": 0.1,
    "safe_bottom": 0.78,
    "border_fraction": 0.02,
    "aspect_tolerance": 0.025,
    "max_seconds": 120,
    "max_frames": 7200,
    "max_dimension": 640
  },
  "caption_detection": {
    "status": "active",
    "model": "OpenCV Zoo PP-OCRv3 DB English",
    "interval_seconds": 0.5
  },
  "issues": [
    {
      "type": "blur",
      "start": 2.0,
      "end": 3.0,
      "severity": "error",
      "message": "Export this part again or replace the blurry shot. Sharpening will not restore lost detail.",
      "frames": 24
    },
    {
      "type": "black",
      "start": 5.0,
      "end": 5.5,
      "severity": "error",
      "message": "Check for an unintended black gap. Remove it only if it is a mistake.",
      "frames": 12
    },
    {
      "type": "scene_cut",
      "start": 5.0,
      "end": 5.0417,
      "severity": "review",
      "message": "Check this sudden change of shot. Keep it if the cut is intentional.",
      "frames": 1
    },
    {
      "type": "scene_cut",
      "start": 5.5,
      "end": 5.5417,
      "severity": "review",
      "message": "Check this sudden change of shot. Keep it if the cut is intentional.",
      "frames": 1
    },
    {
      "type": "frozen",
      "start": 6.0,
      "end": 7.5,
      "severity": "review",
      "message": "Check whether the pause is intentional. Remove it only if the video should be moving.",
      "frames": 36
    },
    {
      "type": "caption_clipped",
      "start": 8.0,
      "end": 10.0,
      "severity": "error",
      "message": "Move the text away from the edge and export again. Check the original wording for missing letters.",
      "frames": 48
    },
    {
      "type": "caption_safe_zone",
      "start": 8.0,
      "end": 10.0,
      "severity": "error",
      "message": "Move the text inside the green safe rectangle so app buttons are less likely to cover it. Export again.",
      "frames": 48
    },
    {
      "type": "dark",
      "start": 10.5,
      "end": 11.5,
      "severity": "review",
      "message": "Brighten this part a little, then check for washed-out highlights and grain.",
      "frames": 24
    },
    {
      "type": "scene_cut",
      "start": 10.5,
      "end": 10.5417,
      "severity": "review",
      "message": "Check this sudden change of shot. Keep it if the cut is intentional.",
      "frames": 1
    },
    {
      "type": "scene_cut",
      "start": 11.5,
      "end": 11.5417,
      "severity": "review",
      "message": "Check this sudden change of shot. Keep it if the cut is intentional.",
      "frames": 1
    }
  ],
  "summary": {
    "status": "needs_review",
    "issue_count": 10,
    "types": [
      "black",
      "blur",
      "caption_clipped",
      "caption_safe_zone",
      "dark",
      "frozen",
      "scene_cut"
    ]
  },
  "fix_plan": [
    {
      "type": "black",
      "action": "Check for an unintended black gap. Remove it only if it is a mistake.",
      "automatic_candidate": true
    },
    {
      "type": "blur",
      "action": "Export this part again or replace the blurry shot. Sharpening will not restore lost detail.",
      "automatic_candidate": false
    },
    {
      "type": "caption_clipped",
      "action": "Move the text away from the edge and export again. Check the original wording for missing letters.",
      "automatic_candidate": false
    },
    {
      "type": "caption_safe_zone",
      "action": "Move the text inside the green safe rectangle so app buttons are less likely to cover it. Export again.",
      "automatic_candidate": false
    },
    {
      "type": "dark",
      "action": "Brighten this part a little, then check for washed-out highlights and grain.",
      "automatic_candidate": true
    },
    {
      "type": "frozen",
      "action": "Check whether the pause is intentional. Remove it only if the video should be moving.",
      "automatic_candidate": true
    },
    {
      "type": "scene_cut",
      "action": "Check this sudden change of shot. Keep it if the cut is intentional.",
      "automatic_candidate": false
    }
  ],
  "artifacts": {
    "metrics": "metrics.csv",
    "contact_sheet": "contact-sheet.jpg"
  },
  "limitations": [
    "Heuristic thresholds require calibration to the source style.",
    "Freeze recommendations are withheld during severe blur and low exposure because motion evidence is unreliable.",
    "Intentional stills, fades and cuts require human review.",
    "Safe zones are configurable generic guides, not platform guarantees.",
    "Text detection cannot prove that missing glyphs were cropped; edge contact is a risk signal.",
    "Variable frame rate timestamps are approximated using nominal FPS; normalize to CFR for precise edits."
  ],
  "analysis_seconds": 9.8851,
  "cloud": {
    "job_id": "d8034bb16d7a8eddd1c593aafa3e33f56820d3e9023551b63de68b4d024f04f1",
    "mode": "aws",
    "report_key": "reports/d8034bb16d7a8eddd1c593aafa3e33f56820d3e9023551b63de68b4d024f04f1/report.json",
    "request_id": "ed00896f-9a14-4fb1-8cef-172c0ee32558"
  }
}