summaryrefslogtreecommitdiff
path: root/multimedia/wl-screenrec/files/patch-ffmpeg71
blob: f51c41547bf06ae2fd594c6a1e976c4453498daf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
https://github.com/russelltg/wl-screenrec/commit/36b2c6f570f6

$ wl-screenrec
Opening libva device from DRM device /dev/dri/renderD128
[in @ 0x4909a9ab5400] Setting BufferSourceContext.pix_fmt to a HW format requires hw_frames_ctx to be non-NULL!

thread 'main' panicked at src/main.rs:1741:6:
called `Result::unwrap()` on an `Err` value: ffmpeg::Error(22: Invalid argument)

--- src/main.rs.orig	2024-08-04 17:10:34 UTC
+++ src/main.rs
@@ -27,8 +27,8 @@ use ffmpeg::{
     ffi::{
         av_buffer_ref, av_buffersrc_parameters_alloc, av_buffersrc_parameters_set,
         av_dict_parse_string, av_free, av_get_pix_fmt_name, av_hwframe_map, avcodec_alloc_context3,
-        avformat_query_codec, AVDRMFrameDescriptor, AVPixelFormat, AV_HWFRAME_MAP_WRITE,
-        FF_COMPLIANCE_STRICT,
+        avfilter_graph_alloc_filter, avfilter_init_dict, avformat_query_codec,
+        AVDRMFrameDescriptor, AVPixelFormat, AV_HWFRAME_MAP_WRITE, FF_COMPLIANCE_STRICT,
     },
     filter,
     format::{self, Pixel},
@@ -1728,19 +1728,19 @@ fn video_filter(
     transform: Transform,
 ) -> (filter::Graph, Rational) {
     let mut g = ffmpeg::filter::graph::Graph::new();
-    g.add(
-        &filter::find("buffer").unwrap(),
-        "in",
-        // format is bogus, will be replaced below, as we need to pass
-        // hw_frames_ctx which isn't possible with args=
-        &format!(
-            "video_size=2840x2160:pix_fmt={}:time_base=1/1000000000",
-            AVPixelFormat::AV_PIX_FMT_VAAPI as c_int
-        ),
-    )
-    .unwrap();
 
+
+    // src
     unsafe {
+        let buffersrc_ctx = avfilter_graph_alloc_filter(
+            g.as_mut_ptr(),
+            filter::find("buffer").unwrap().as_mut_ptr(),
+            c"in".as_ptr() as _,
+        );
+        if buffersrc_ctx.is_null() {
+            panic!("faield to alloc buffersrc filter");
+        }
+
         let p = &mut *av_buffersrc_parameters_alloc();
 
         p.width = capture_width;
@@ -1750,21 +1750,17 @@ fn video_filter(
         p.time_base.den = 1_000_000_000;
         p.hw_frames_ctx = inctx.as_mut_ptr();
 
-        let sts = av_buffersrc_parameters_set(g.get("in").unwrap().as_mut_ptr(), p as *mut _);
+        let sts = av_buffersrc_parameters_set(buffersrc_ctx, p as *mut _);
         assert_eq!(sts, 0);
-
         av_free(p as *mut _ as *mut _);
+
+        let sts = avfilter_init_dict(buffersrc_ctx, null_mut());
+        assert_eq!(sts, 0);
     }
 
+    // sink
     g.add(&filter::find("buffersink").unwrap(), "out", "")
         .unwrap();
-
-    let mut out = g.get("out").unwrap();
-
-    out.set_pixel_format(match pix_fmt {
-        EncodePixelFormat::Vaapi(_) => Pixel::VAAPI,
-        EncodePixelFormat::Sw(sw) => sw,
-    });
 
     let output_real_pixfmt_name = unsafe {
         from_utf8_unchecked(