20#include <winpr/assert.h>
21#include <winpr/winpr.h>
25#define TAG CHANNELS_TAG("rdpecam-video.client")
32UINT32 h264_get_max_bitrate(UINT32 height)
34 static struct Bitrates
44 { 1080, 2700 }, { 720, 1250 }, { 480, 700 }, { 360, 400 },
45 { 240, 170 }, { 180, 140 }, { 0, 100 },
47 const size_t nBitrates = ARRAYSIZE(bitrates);
49 for (
size_t i = 0; i < nBitrates; i++)
51 if (height >= bitrates[i].height)
53 UINT32 bitrate = bitrates[i].bitrate;
54 WLog_DBG(TAG,
"Setting h264 max bitrate: %u kbps", bitrate);
55 return bitrate * 1000;
68FREERDP_VIDEO_FORMAT ecamToVideoFormat(CAM_MEDIA_FORMAT ecamFormat)
72 case CAM_MEDIA_FORMAT_YUY2:
73 return FREERDP_VIDEO_FORMAT_YUYV422;
74 case CAM_MEDIA_FORMAT_NV12:
75 return FREERDP_VIDEO_FORMAT_NV12;
76 case CAM_MEDIA_FORMAT_I420:
77 return FREERDP_VIDEO_FORMAT_YUV420P;
78 case CAM_MEDIA_FORMAT_RGB24:
79 return FREERDP_VIDEO_FORMAT_RGB24;
80 case CAM_MEDIA_FORMAT_RGB32:
81 return FREERDP_VIDEO_FORMAT_RGB32;
82 case CAM_MEDIA_FORMAT_H264:
83 return FREERDP_VIDEO_FORMAT_H264;
84 case CAM_MEDIA_FORMAT_MJPG:
85 return FREERDP_VIDEO_FORMAT_MJPEG;
87 WLog_ERR(TAG,
"Unsupported ecamFormat %u", ecamFormat);
88 return FREERDP_VIDEO_FORMAT_NONE;
100 WINPR_ASSERT(stream);
106 freerdp_video_context_new(stream->currMediaType.Width, stream->currMediaType.Height);
109 WLog_ERR(TAG,
"freerdp_video_context_new failed");
123 if (!ecam_init_video_context(stream))
126 const UINT32 framerate =
127 stream->currMediaType.FrameRateNumerator / stream->currMediaType.FrameRateDenominator;
129 if (!freerdp_video_context_reconfigure(stream->video, stream->currMediaType.Width,
130 stream->currMediaType.Height, framerate, 0,
131 H264_CAMERA_VIDEO_REAL_TIME))
133 WLog_ERR(TAG,
"Failed to configure H.264 encoder");
152 freerdp_video_context_free(stream->video);
153 stream->video =
nullptr;
164BOOL ecam_encoder_compress(
CameraDeviceStream* stream,
const BYTE* srcData,
size_t srcSize,
167 const FREERDP_VIDEO_FORMAT inputFormat = ecamToVideoFormat(streamInputFormat(stream));
168 const FREERDP_VIDEO_FORMAT outputFormat = ecamToVideoFormat(streamOutputFormat(stream));
170 if (!ecam_encoder_context_init(stream))
173 return freerdp_video_sample_convert(stream->video, inputFormat, srcData, srcSize, outputFormat,