@@ -158,9 +158,10 @@ void ivf_write_frame_header(FILE *outfile, int64_t pts, size_t frame_size) {
158
158
159
159
class ScreencastEncoder ::VPXFrame {
160
160
public:
161
- VPXFrame (rtc::scoped_refptr<webrtc::VideoFrameBuffer>&& buffer, Maybe<double > scale)
161
+ VPXFrame (rtc::scoped_refptr<webrtc::VideoFrameBuffer>&& buffer, Maybe<double > scale, int offsetTop )
162
162
: m_frameBuffer(std::move(buffer))
163
163
, m_scale(scale)
164
+ , m_offsetTop(offsetTop)
164
165
{ }
165
166
166
167
void setDuration (int duration) { m_duration = duration; }
@@ -189,15 +190,15 @@ class ScreencastEncoder::VPXFrame {
189
190
src_width *= image->w / dst_width;
190
191
dst_width = image->w ;
191
192
}
192
- int src_height = src->height ();
193
+ int src_height = src->height () - m_offsetTop ;
193
194
double dst_height = src_height * m_scale.value ();
194
195
if (dst_height > image->h ) {
195
196
src_height *= image->h / dst_height;
196
197
dst_height = image->h ;
197
198
}
198
- libyuv::I420Scale (src->DataY (), src->StrideY (),
199
- src->DataU (), src->StrideU (),
200
- src->DataV (), src->StrideV (),
199
+ libyuv::I420Scale (src->DataY () + m_offsetTop * src-> StrideY () , src->StrideY (),
200
+ src->DataU () + (m_offsetTop + 1 ) / 2 * src-> StrideU () , src->StrideU (),
201
+ src->DataV () + (m_offsetTop + 1 ) / 2 * src-> StrideV () , src->StrideV (),
201
202
src_width, src_height,
202
203
y_data, y_stride,
203
204
u_data, uv_stride,
@@ -206,10 +207,11 @@ class ScreencastEncoder::VPXFrame {
206
207
libyuv::kFilterBilinear );
207
208
} else {
208
209
int width = std::min<int >(image->w , src->width ());
209
- int height = std::min<int >(image->h , src->height ());
210
- libyuv::I420Copy (src->DataY (), src->StrideY (),
211
- src->DataU (), src->StrideU (),
212
- src->DataV (), src->StrideV (),
210
+ int height = std::min<int >(image->h , src->height () - m_offsetTop);
211
+
212
+ libyuv::I420Copy (src->DataY () + m_offsetTop * src->StrideY (), src->StrideY (),
213
+ src->DataU () + (m_offsetTop + 1 ) / 2 * src->StrideU (), src->StrideU (),
214
+ src->DataV () + (m_offsetTop + 1 ) / 2 * src->StrideV (), src->StrideV (),
213
215
y_data, y_stride,
214
216
u_data, uv_stride,
215
217
v_data, uv_stride,
@@ -220,6 +222,7 @@ class ScreencastEncoder::VPXFrame {
220
222
private:
221
223
rtc::scoped_refptr<webrtc::VideoFrameBuffer> m_frameBuffer;
222
224
Maybe<double > m_scale;
225
+ int m_offsetTop = 0 ;
223
226
int m_duration = 0 ;
224
227
};
225
228
@@ -325,11 +328,10 @@ class ScreencastEncoder::VPXCodec {
325
328
std::unique_ptr<vpx_image_t > m_image;
326
329
};
327
330
328
- ScreencastEncoder::ScreencastEncoder (std::unique_ptr<VPXCodec>&& vpxCodec, int width, int height, Maybe<double > scale)
331
+ ScreencastEncoder::ScreencastEncoder (std::unique_ptr<VPXCodec>&& vpxCodec, Maybe<double > scale, int offsetTop )
329
332
: m_vpxCodec(std::move(vpxCodec))
330
- , m_width(width)
331
- , m_height(height)
332
333
, m_scale(scale)
334
+ , m_offsetTop(offsetTop)
333
335
{
334
336
}
335
337
@@ -338,10 +340,9 @@ ScreencastEncoder::~ScreencastEncoder()
338
340
}
339
341
340
342
static constexpr uint32_t vp8fourcc = 0x30385056 ;
341
- static constexpr uint32_t vp9fourcc = 0x30395056 ;
342
- static constexpr int fps = 30 ;
343
+ static constexpr int fps = 24 ;
343
344
344
- RefPtr<ScreencastEncoder> ScreencastEncoder::create (nsCString& errorString, const nsCString& filePath, int width, int height, Maybe<double > scale)
345
+ RefPtr<ScreencastEncoder> ScreencastEncoder::create (nsCString& errorString, const nsCString& filePath, int width, int height, Maybe<double > scale, int offsetTop )
345
346
{
346
347
const uint32_t fourcc = vp8fourcc;
347
348
vpx_codec_iface_t * codec_interface = vpx_codec_vp8_cx ();
@@ -383,7 +384,7 @@ RefPtr<ScreencastEncoder> ScreencastEncoder::create(nsCString& errorString, cons
383
384
384
385
std::unique_ptr<VPXCodec> vpxCodec (new VPXCodec (fourcc, codec, cfg, file));
385
386
fprintf (stderr, " ScreencastEncoder initialized with: %s\n " , vpx_codec_iface_name (codec_interface));
386
- return new ScreencastEncoder (std::move (vpxCodec), width, height, scale );
387
+ return new ScreencastEncoder (std::move (vpxCodec), scale, offsetTop );
387
388
}
388
389
389
390
void ScreencastEncoder::flushLastFrame ()
@@ -407,7 +408,7 @@ void ScreencastEncoder::encodeFrame(const webrtc::VideoFrame& videoFrame)
407
408
fprintf (stderr, " ScreencastEncoder::encodeFrame\n " );
408
409
flushLastFrame ();
409
410
410
- m_lastFrame = std::make_unique<VPXFrame>(videoFrame.video_frame_buffer (), m_scale);
411
+ m_lastFrame = std::make_unique<VPXFrame>(videoFrame.video_frame_buffer (), m_scale, m_offsetTop );
411
412
}
412
413
413
414
void ScreencastEncoder::finish (std::function<void ()>&& callback)
0 commit comments