(&self, frame: &ffi::xcw_native_frame)
| 1545 | } |
| 1546 | |
| 1547 | fn handle_encoded_frame(&self, frame: &ffi::xcw_native_frame) { |
| 1548 | let Some(data) = (unsafe { copy_native_shared_bytes(frame.data) }) else { |
| 1549 | return; |
| 1550 | }; |
| 1551 | let description = unsafe { copy_native_shared_bytes(frame.description) }; |
| 1552 | let codec = unsafe { native_c_string(frame.codec) }; |
| 1553 | let frame_sequence = self.frame_sequence.fetch_add(1, Ordering::Relaxed) + 1; |
| 1554 | let packet = Arc::new(FramePacket { |
| 1555 | frame_sequence, |
| 1556 | timestamp_us: frame.timestamp_us, |
| 1557 | is_keyframe: frame.is_keyframe, |
| 1558 | width: frame.width, |
| 1559 | height: frame.height, |
| 1560 | codec, |
| 1561 | description, |
| 1562 | data, |
| 1563 | }); |
| 1564 | self.metrics.frames_encoded.fetch_add(1, Ordering::Relaxed); |
| 1565 | if packet.is_keyframe { |
| 1566 | self.metrics |
| 1567 | .keyframes_encoded |
| 1568 | .fetch_add(1, Ordering::Relaxed); |
| 1569 | *self.latest_keyframe.write().unwrap() = Some(packet.clone()); |
| 1570 | } |
| 1571 | let _ = self.sender.send(packet); |
| 1572 | } |
| 1573 | } |
| 1574 | |
| 1575 | unsafe extern "C" fn android_h264_encoder_frame_callback( |
no test coverage detected