@@ -33,83 +33,77 @@ namespace dolbyio::comms::native {
3333
3434 void handle_frame (std::unique_ptr<video_frame> frame) {
3535 int bytes_per_pixel = 4 ;
36+ size_t width, height = 0 ;
37+ uint8_t * resbuffer = nullptr ;
3638
3739#if defined(__APPLE__)
3840 video_frame_macos *mac_frame = frame->get_native_frame ();
39- CVPixelBufferRef buffer = mac_frame->get_buffer ();
40- int res = CVPixelBufferLockBaseAddress (buffer, kCVPixelBufferLock_ReadOnly );
41-
42- // Sanity check for ensuring we are capturing NV12 from camera
43- auto format_type = CVPixelBufferGetPixelFormatType (buffer);
44- if (format_type != kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange &&
45- format_type != kCVPixelFormatType_420YpCbCr8BiPlanarFullRange )
46- return ;
47-
48- size_t width = CVPixelBufferGetWidth (buffer);
49- size_t height = CVPixelBufferGetHeight (buffer);
50-
51- uint8_t *y_buffer = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane (buffer, 0 );
52- int y_stride = CVPixelBufferGetBytesPerRowOfPlane (buffer, 0 );
53-
54- uint8_t *uv_buffer = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane (buffer, 1 );
55- int uv_stride = CVPixelBufferGetBytesPerRowOfPlane (buffer, 1 );
41+ if (mac_frame) {
42+ CVPixelBufferRef buffer = mac_frame->get_buffer ();
43+ int res = CVPixelBufferLockBaseAddress (buffer, kCVPixelBufferLock_ReadOnly );
44+
45+ // Sanity check for ensuring we are capturing NV12 from camera
46+ auto format_type = CVPixelBufferGetPixelFormatType (buffer);
47+ if (format_type != kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange &&
48+ format_type != kCVPixelFormatType_420YpCbCr8BiPlanarFullRange )
49+ return ;
50+
51+ width = CVPixelBufferGetWidth (buffer);
52+ height = CVPixelBufferGetHeight (buffer);
53+
54+ uint8_t *y_buffer = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane (buffer, 0 );
55+ int y_stride = CVPixelBufferGetBytesPerRowOfPlane (buffer, 0 );
56+
57+ uint8_t *uv_buffer = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane (buffer, 1 );
58+ int uv_stride = CVPixelBufferGetBytesPerRowOfPlane (buffer, 1 );
59+
60+ resbuffer = (uint8_t *)malloc (sizeof (uint8_t ) * width * height * bytes_per_pixel);
61+
62+ nv12_rgb24_std (
63+ frame->width (),
64+ frame->height (),
65+ y_buffer,
66+ uv_buffer,
67+ y_stride,
68+ uv_stride,
69+ resbuffer,
70+ width * bytes_per_pixel,
71+ ycbcr_type::ycbcr_jpeg);
72+
73+ CVPixelBufferUnlockBaseAddress (buffer, kCVPixelBufferLock_ReadOnly );
74+ } else {
75+ #endif
5676
77+ auto frame_i420 = frame->get_i420_frame ();
5778
58- uint8_t *resbuffer = (uint8_t *)malloc (sizeof (uint8_t ) * width * height * bytes_per_pixel);
79+ width = frame->width ();
80+ height = frame->height ();
5981
60- for (int y = 0 ; y < height; y++) {
61- uint8_t *rgb_line = &resbuffer[y * width * bytes_per_pixel];
62- uint8_t *y_addr = &y_buffer[y * y_stride];
63- uint8_t *uv_addr = &uv_buffer[(y >> 1 ) * uv_stride];
82+ resbuffer = (uint8_t *)malloc (sizeof (uint8_t ) * width * height * bytes_per_pixel);
6483
65- for (int x = 0 ; x < width; x++) {
66- int16_t yy = y_addr[x];
67- int16_t cb = uv_addr[x & ~1 ] - 128 ;
68- int16_t cr = uv_addr[x | 1 ] - 128 ;
84+ const uint8_t * y_addr = frame_i420->get_y ();
85+ const uint8_t * u_addr = frame_i420->get_u ();
86+ const uint8_t * v_addr = frame_i420->get_v ();
6987
70- uint8_t *rgb_output = &rgb_line[x * bytes_per_pixel];
88+ int y_stride = frame_i420->stride_y ();
89+ int u_stride = frame_i420->stride_u ();
90+ int v_stride = frame_i420->stride_v ();
7191
72- // BT.601 limited.
73- int16_t r = (yy - 16 ) * 1.164 + cr * 1.596 ;
74- int16_t g = (yy - 16 ) * 1.164 + cb * -0.391 + cr * -0.813 ;
75- int16_t b = (yy - 16 ) * 1.164 + cb * 2.018 ;
92+ yuv420_rgb24_std (
93+ width,
94+ height,
95+ y_addr,
96+ u_addr,
97+ v_addr,
98+ y_stride,
99+ u_stride,
100+ resbuffer,
101+ width * bytes_per_pixel,
102+ ycbcr_type::ycbcr_jpeg
103+ );
76104
77- rgb_output[0 ] = 0xff ;
78- rgb_output[1 ] = clamp (r);
79- rgb_output[2 ] = clamp (g);
80- rgb_output[3 ] = clamp (b);
81- }
105+ #if defined(__APPLE__)
82106 }
83-
84- CVPixelBufferUnlockBaseAddress (buffer, kCVPixelBufferLock_ReadOnly );
85- #else
86- auto frame_i420 = frame->get_i420_frame ();
87-
88- size_t width = frame->width ();
89- size_t height = frame->height ();
90-
91- uint8_t * resbuffer = (uint8_t *)malloc (sizeof (uint8_t ) * width * height * bytes_per_pixel);
92-
93- const uint8_t * y_addr = frame_i420->get_y ();
94- const uint8_t * u_addr = frame_i420->get_u ();
95- const uint8_t * v_addr = frame_i420->get_v ();
96-
97- int y_stride = frame_i420->stride_y ();
98- int u_stride = frame_i420->stride_u ();
99- int v_stride = frame_i420->stride_v ();
100-
101- yuv420_rgb24_std (
102- width,
103- height,
104- y_addr,
105- u_addr,
106- v_addr,
107- y_stride,
108- u_stride,
109- resbuffer,
110- width * bytes_per_pixel,
111- ycbcr_type::ycbcr_2020_full
112- );
113107#endif
114108
115109 delegate_ (width, height, resbuffer);
0 commit comments