// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

mod h265;
mod test_suite;

use crate::test_suite::*;
use fidl_fuchsia_media::*;
use fidl_fuchsia_sysmem as sysmem;
use fuchsia_async as fasync;
use std::rc::Rc;
use stream_processor_test::*;

// Instructions for capturing output of encoder:
// 1. Set the `output_file` field to write the encoded output into "/tmp/".
// 2. Add exec.run_singlethreaded(future::pending()) at the end of the test so it doesn't exit.
//    This is so the tmp file doesn't get cleaned up.
// 3. Use `ffx component copy` to copy the file to the host.

#[fuchsia::test]
fn h265_stream_output_generated() -> Result<()> {
    const WIDTH: u32 = 320;
    const HEIGHT: u32 = 240;
    let mut exec = fasync::TestExecutor::new();

    let test_case = H265EncoderTestCase {
        input_format: sysmem::ImageFormat2 {
            pixel_format: sysmem::PixelFormat {
                type_: sysmem::PixelFormatType::Nv12,
                has_format_modifier: false,
                format_modifier: sysmem::FormatModifier { value: 0 },
            },
            coded_width: WIDTH,
            coded_height: HEIGHT,
            bytes_per_row: WIDTH,
            display_width: WIDTH,
            display_height: HEIGHT,
            layers: 0,
            color_space: sysmem::ColorSpace { type_: sysmem::ColorSpaceType::Rec601Pal },
            has_pixel_aspect_ratio: false,
            pixel_aspect_ratio_width: 0,
            pixel_aspect_ratio_height: 0,
        },
        num_frames: 6,
        settings: Rc::new(move || -> EncoderSettings {
            EncoderSettings::Hevc(HevcEncoderSettings {
                bit_rate: Some(1000000),
                frame_rate: Some(30),
                gop_size: Some(2),
                ..Default::default()
            })
        }),
        expected_key_frames: Some(3),
        output_file: None,
    };
    exec.run_singlethreaded(test_case.run())?;
    Ok(())
}
