Skip to main content

generate_black_square_512x512/
generate_black_square_512x512.rs

1use libav_ng::{self, avcodec::CodecContext, avformat::FormatContext, avframe::Frame, avpacket::Packet, avstream::Stream, low_level};
2use libav_sys_ng::{AVPixelFormat_AV_PIX_FMT_RGB24, AVIO_FLAG_WRITE};
3
4fn main() {
5    let filename = "bk.png";
6    let width = 512;
7    let height = 512;
8
9    let mut format_ctx =
10        FormatContext::new("image2", filename, None).expect("Failed to create FormatContext");
11
12    let mut codec = CodecContext::from_encoder_id(low_level::AVCodecID_AV_CODEC_ID_PNG)
13        .expect("Failed to create CodecContext");
14
15    let mut stream =
16        Stream::new(&mut format_ctx, Some(&*codec)).expect("Failed to create a stream");
17
18    codec
19        .set_size(width, height)
20        .set_framerate(1)
21        .set_pixel_format(low_level::AVPixelFormat_AV_PIX_FMT_RGB24)
22        .set_bitrate(400_000)
23        .set_gop_size(1)
24        .set_max_b_frames(1);
25
26    if (format_ctx.get_output_format().flags & low_level::AVFMT_GLOBALHEADER as i32) != 0 {
27        let flags = codec.get_flags() | low_level::AV_CODEC_FLAG_GLOBAL_HEADER as i32;
28
29        codec.set_flags(flags);
30    }
31
32    match codec.open(None) {
33        Err(err) => panic!("Error opening codec: {}", err),
34        Ok(()) => {}
35    };
36
37    codec.fill_stream_parameters(&mut stream);
38
39    match format_ctx.open(filename, AVIO_FLAG_WRITE as i32) {
40        Err(err) => panic!("Error opening file! {err}"),
41        Ok(()) => {}
42    };
43
44    format_ctx
45        .write_header(None)
46        .expect("Failed to write a header!");
47
48    let mut frame = Frame::from_size_and_pixfmt(width, height, AVPixelFormat_AV_PIX_FMT_RGB24)
49        .expect("Failed to make a frame!");
50
51    let data = frame.data_plane_mut(0).expect("Failed to get plane!");
52
53    for y in 0usize..height as usize {
54        for x in 0usize..width as usize {
55            let coord = y * (width as usize * 3usize) + (x * 3);
56
57            data[coord + 0] = 0xff;
58            data[coord + 1] = 0xff;
59            data[coord + 2] = 0xff;
60        }
61    }
62
63    codec.send_frame(&frame);
64
65    let mut packet = Packet::new();
66
67    codec.receive_packet(&mut packet);
68
69    format_ctx.write_frame(&mut packet);
70
71    packet.clear();
72
73    format_ctx.write_trailer();
74
75    println!("Hello, world!");
76}