blob: ab1a6bef408fdddce69fca01e510942fa645ca0d [file] [log] [blame]
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -07001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/video_frame.h"
12
13#include <string.h>
14
15#include <algorithm> // swap
16
17#include "webrtc/base/bind.h"
18#include "webrtc/base/checks.h"
19
20namespace webrtc {
21
hbosbab934b2016-01-27 01:36:03 -080022// FFmpeg's decoder, used by H264DecoderImpl, requires up to 8 bytes padding due
23// to optimized bitstream readers. See avcodec_decode_video2.
24const size_t EncodedImage::kBufferPaddingBytesH264 = 8;
hbosd6648362016-01-21 05:43:11 -080025
nissec7fe3c22016-04-20 03:25:36 -070026VideoFrame::VideoFrame()
27 : video_frame_buffer_(nullptr),
nisse74c10b52016-09-05 00:51:16 -070028 timestamp_rtp_(0),
nissec7fe3c22016-04-20 03:25:36 -070029 ntp_time_ms_(0),
nisse74c10b52016-09-05 00:51:16 -070030 timestamp_us_(0),
nissec7fe3c22016-04-20 03:25:36 -070031 rotation_(kVideoRotation_0) {}
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070032
33VideoFrame::VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer,
nisse74c10b52016-09-05 00:51:16 -070034 webrtc::VideoRotation rotation,
35 int64_t timestamp_us)
36 : video_frame_buffer_(buffer),
37 timestamp_rtp_(0),
38 ntp_time_ms_(0),
39 timestamp_us_(timestamp_us),
40 rotation_(rotation) {}
41
42VideoFrame::VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer,
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070043 uint32_t timestamp,
44 int64_t render_time_ms,
45 VideoRotation rotation)
46 : video_frame_buffer_(buffer),
nisse74c10b52016-09-05 00:51:16 -070047 timestamp_rtp_(timestamp),
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070048 ntp_time_ms_(0),
nisse74c10b52016-09-05 00:51:16 -070049 timestamp_us_(render_time_ms * rtc::kNumMicrosecsPerMillisec),
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070050 rotation_(rotation) {
nisse94cd3fa2016-05-23 23:35:54 -070051 RTC_DCHECK(buffer);
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070052}
53
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070054int VideoFrame::width() const {
55 return video_frame_buffer_ ? video_frame_buffer_->width() : 0;
56}
57
58int VideoFrame::height() const {
59 return video_frame_buffer_ ? video_frame_buffer_->height() : 0;
60}
61
62bool VideoFrame::IsZeroSize() const {
63 return !video_frame_buffer_;
64}
65
nissee3fe4a72016-11-10 08:44:38 -080066rtc::scoped_refptr<VideoFrameBuffer> VideoFrame::video_frame_buffer() const {
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070067 return video_frame_buffer_;
68}
69
hbosd6648362016-01-21 05:43:11 -080070size_t EncodedImage::GetBufferPaddingBytes(VideoCodecType codec_type) {
71 switch (codec_type) {
72 case kVideoCodecVP8:
73 case kVideoCodecVP9:
74 return 0;
75 case kVideoCodecH264:
76 return kBufferPaddingBytesH264;
77 case kVideoCodecI420:
78 case kVideoCodecRED:
79 case kVideoCodecULPFEC:
brandtr87d7d772016-11-07 03:03:41 -080080 case kVideoCodecFlexfec:
hbosd6648362016-01-21 05:43:11 -080081 case kVideoCodecGeneric:
82 case kVideoCodecUnknown:
83 return 0;
84 }
85 RTC_NOTREACHED();
86 return 0;
87}
88
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070089} // namespace webrtc