| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2004 Google Inc. | 3 * Copyright 2004 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 virtual ~VideoFrame() {} | 42 virtual ~VideoFrame() {} |
| 43 | 43 |
| 44 virtual bool InitToBlack(int w, int h, size_t pixel_width, | 44 virtual bool InitToBlack(int w, int h, size_t pixel_width, |
| 45 size_t pixel_height, int64_t time_stamp) = 0; | 45 size_t pixel_height, int64_t time_stamp) = 0; |
| 46 // Creates a frame from a raw sample with FourCC |format| and size |w| x |h|. | 46 // Creates a frame from a raw sample with FourCC |format| and size |w| x |h|. |
| 47 // |h| can be negative indicating a vertically flipped image. | 47 // |h| can be negative indicating a vertically flipped image. |
| 48 // |dw| is destination width; can be less than |w| if cropping is desired. | 48 // |dw| is destination width; can be less than |w| if cropping is desired. |
| 49 // |dh| is destination height, like |dw|, but must be a positive number. | 49 // |dh| is destination height, like |dw|, but must be a positive number. |
| 50 // Returns whether the function succeeded or failed. | 50 // Returns whether the function succeeded or failed. |
| 51 | 51 |
| 52 virtual bool Reset(uint32 fourcc, | 52 virtual bool Reset(uint32_t fourcc, |
| 53 int w, | 53 int w, |
| 54 int h, | 54 int h, |
| 55 int dw, | 55 int dw, |
| 56 int dh, | 56 int dh, |
| 57 uint8* sample, | 57 uint8_t* sample, |
| 58 size_t sample_size, | 58 size_t sample_size, |
| 59 size_t pixel_width, | 59 size_t pixel_width, |
| 60 size_t pixel_height, | 60 size_t pixel_height, |
| 61 int64_t time_stamp, | 61 int64_t time_stamp, |
| 62 webrtc::VideoRotation rotation, | 62 webrtc::VideoRotation rotation, |
| 63 bool apply_rotation) = 0; | 63 bool apply_rotation) = 0; |
| 64 | 64 |
| 65 // TODO(guoweis): Remove this once all external implementations are updated. | 65 // TODO(guoweis): Remove this once all external implementations are updated. |
| 66 virtual bool Reset(uint32 fourcc, | 66 virtual bool Reset(uint32_t fourcc, |
| 67 int w, | 67 int w, |
| 68 int h, | 68 int h, |
| 69 int dw, | 69 int dw, |
| 70 int dh, | 70 int dh, |
| 71 uint8* sample, | 71 uint8_t* sample, |
| 72 size_t sample_size, | 72 size_t sample_size, |
| 73 size_t pixel_width, | 73 size_t pixel_width, |
| 74 size_t pixel_height, | 74 size_t pixel_height, |
| 75 int64_t time_stamp, | 75 int64_t time_stamp, |
| 76 int rotation) { | 76 int rotation) { |
| 77 return Reset(fourcc, w, h, dw, dh, sample, sample_size, pixel_width, | 77 return Reset(fourcc, w, h, dw, dh, sample, sample_size, pixel_width, |
| 78 pixel_height, time_stamp, | 78 pixel_height, time_stamp, |
| 79 static_cast<webrtc::VideoRotation>(rotation), true); | 79 static_cast<webrtc::VideoRotation>(rotation), true); |
| 80 } | 80 } |
| 81 | 81 |
| 82 // Basic accessors. | 82 // Basic accessors. |
| 83 // Note this is the width and height without rotation applied. | 83 // Note this is the width and height without rotation applied. |
| 84 virtual size_t GetWidth() const = 0; | 84 virtual size_t GetWidth() const = 0; |
| 85 virtual size_t GetHeight() const = 0; | 85 virtual size_t GetHeight() const = 0; |
| 86 | 86 |
| 87 size_t GetChromaWidth() const { return (GetWidth() + 1) / 2; } | 87 size_t GetChromaWidth() const { return (GetWidth() + 1) / 2; } |
| 88 size_t GetChromaHeight() const { return (GetHeight() + 1) / 2; } | 88 size_t GetChromaHeight() const { return (GetHeight() + 1) / 2; } |
| 89 size_t GetChromaSize() const { return GetUPitch() * GetChromaHeight(); } | 89 size_t GetChromaSize() const { return GetUPitch() * GetChromaHeight(); } |
| 90 // These can return NULL if the object is not backed by a buffer. | 90 // These can return NULL if the object is not backed by a buffer. |
| 91 virtual const uint8 *GetYPlane() const = 0; | 91 virtual const uint8_t* GetYPlane() const = 0; |
| 92 virtual const uint8 *GetUPlane() const = 0; | 92 virtual const uint8_t* GetUPlane() const = 0; |
| 93 virtual const uint8 *GetVPlane() const = 0; | 93 virtual const uint8_t* GetVPlane() const = 0; |
| 94 virtual uint8 *GetYPlane() = 0; | 94 virtual uint8_t* GetYPlane() = 0; |
| 95 virtual uint8 *GetUPlane() = 0; | 95 virtual uint8_t* GetUPlane() = 0; |
| 96 virtual uint8 *GetVPlane() = 0; | 96 virtual uint8_t* GetVPlane() = 0; |
| 97 | 97 |
| 98 virtual int32 GetYPitch() const = 0; | 98 virtual int32_t GetYPitch() const = 0; |
| 99 virtual int32 GetUPitch() const = 0; | 99 virtual int32_t GetUPitch() const = 0; |
| 100 virtual int32 GetVPitch() const = 0; | 100 virtual int32_t GetVPitch() const = 0; |
| 101 | 101 |
| 102 // Returns the handle of the underlying video frame. This is used when the | 102 // Returns the handle of the underlying video frame. This is used when the |
| 103 // frame is backed by a texture. The object should be destroyed when it is no | 103 // frame is backed by a texture. The object should be destroyed when it is no |
| 104 // longer in use, so the underlying resource can be freed. | 104 // longer in use, so the underlying resource can be freed. |
| 105 virtual void* GetNativeHandle() const = 0; | 105 virtual void* GetNativeHandle() const = 0; |
| 106 | 106 |
| 107 // Returns the underlying video frame buffer. This function is ok to call | 107 // Returns the underlying video frame buffer. This function is ok to call |
| 108 // multiple times, but the returned object will refer to the same memory. | 108 // multiple times, but the returned object will refer to the same memory. |
| 109 virtual rtc::scoped_refptr<webrtc::VideoFrameBuffer> GetVideoFrameBuffer() | 109 virtual rtc::scoped_refptr<webrtc::VideoFrameBuffer> GetVideoFrameBuffer() |
| 110 const = 0; | 110 const = 0; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 137 // In case VideoFrame needs exclusive access of the frame buffer, user can | 137 // In case VideoFrame needs exclusive access of the frame buffer, user can |
| 138 // call MakeExclusive() to make sure the frame buffer is exclusively | 138 // call MakeExclusive() to make sure the frame buffer is exclusively |
| 139 // accessible to the current object. This might mean a deep copy of the frame | 139 // accessible to the current object. This might mean a deep copy of the frame |
| 140 // buffer if it is currently shared by other objects. | 140 // buffer if it is currently shared by other objects. |
| 141 virtual bool MakeExclusive() = 0; | 141 virtual bool MakeExclusive() = 0; |
| 142 | 142 |
| 143 // Writes the frame into the given frame buffer, provided that it is of | 143 // Writes the frame into the given frame buffer, provided that it is of |
| 144 // sufficient size. Returns the frame's actual size, regardless of whether | 144 // sufficient size. Returns the frame's actual size, regardless of whether |
| 145 // it was written or not (like snprintf). If there is insufficient space, | 145 // it was written or not (like snprintf). If there is insufficient space, |
| 146 // nothing is written. | 146 // nothing is written. |
| 147 virtual size_t CopyToBuffer(uint8 *buffer, size_t size) const; | 147 virtual size_t CopyToBuffer(uint8_t* buffer, size_t size) const; |
| 148 | 148 |
| 149 // Writes the frame into the given planes, stretched to the given width and | 149 // Writes the frame into the given planes, stretched to the given width and |
| 150 // height. The parameter "interpolate" controls whether to interpolate or just | 150 // height. The parameter "interpolate" controls whether to interpolate or just |
| 151 // take the nearest-point. The parameter "crop" controls whether to crop this | 151 // take the nearest-point. The parameter "crop" controls whether to crop this |
| 152 // frame to the aspect ratio of the given dimensions before stretching. | 152 // frame to the aspect ratio of the given dimensions before stretching. |
| 153 virtual bool CopyToPlanes( | 153 virtual bool CopyToPlanes(uint8_t* dst_y, |
| 154 uint8* dst_y, uint8* dst_u, uint8* dst_v, | 154 uint8_t* dst_u, |
| 155 int32 dst_pitch_y, int32 dst_pitch_u, int32 dst_pitch_v) const; | 155 uint8_t* dst_v, |
| 156 int32_t dst_pitch_y, |
| 157 int32_t dst_pitch_u, |
| 158 int32_t dst_pitch_v) const; |
| 156 | 159 |
| 157 // Writes the frame into the target VideoFrame. | 160 // Writes the frame into the target VideoFrame. |
| 158 virtual void CopyToFrame(VideoFrame* target) const; | 161 virtual void CopyToFrame(VideoFrame* target) const; |
| 159 | 162 |
| 160 // Return a copy of frame which has its pending rotation applied. The | 163 // Return a copy of frame which has its pending rotation applied. The |
| 161 // ownership of the returned frame is held by this frame. | 164 // ownership of the returned frame is held by this frame. |
| 162 virtual const VideoFrame* GetCopyWithRotationApplied() const = 0; | 165 virtual const VideoFrame* GetCopyWithRotationApplied() const = 0; |
| 163 | 166 |
| 164 // Writes the frame into the given stream and returns the StreamResult. | 167 // Writes the frame into the given stream and returns the StreamResult. |
| 165 // See webrtc/base/stream.h for a description of StreamResult and error. | 168 // See webrtc/base/stream.h for a description of StreamResult and error. |
| 166 // Error may be NULL. If a non-success value is returned from | 169 // Error may be NULL. If a non-success value is returned from |
| 167 // StreamInterface::Write(), we immediately return with that value. | 170 // StreamInterface::Write(), we immediately return with that value. |
| 168 virtual rtc::StreamResult Write(rtc::StreamInterface* stream, | 171 virtual rtc::StreamResult Write(rtc::StreamInterface* stream, |
| 169 int* error) const; | 172 int* error) const; |
| 170 | 173 |
| 171 // Converts the I420 data to RGB of a certain type such as ARGB and ABGR. | 174 // Converts the I420 data to RGB of a certain type such as ARGB and ABGR. |
| 172 // Returns the frame's actual size, regardless of whether it was written or | 175 // Returns the frame's actual size, regardless of whether it was written or |
| 173 // not (like snprintf). Parameters size and stride_rgb are in units of bytes. | 176 // not (like snprintf). Parameters size and stride_rgb are in units of bytes. |
| 174 // If there is insufficient space, nothing is written. | 177 // If there is insufficient space, nothing is written. |
| 175 virtual size_t ConvertToRgbBuffer(uint32 to_fourcc, uint8 *buffer, | 178 virtual size_t ConvertToRgbBuffer(uint32_t to_fourcc, |
| 176 size_t size, int stride_rgb) const; | 179 uint8_t* buffer, |
| 180 size_t size, |
| 181 int stride_rgb) const; |
| 177 | 182 |
| 178 // Writes the frame into the given planes, stretched to the given width and | 183 // Writes the frame into the given planes, stretched to the given width and |
| 179 // height. The parameter "interpolate" controls whether to interpolate or just | 184 // height. The parameter "interpolate" controls whether to interpolate or just |
| 180 // take the nearest-point. The parameter "crop" controls whether to crop this | 185 // take the nearest-point. The parameter "crop" controls whether to crop this |
| 181 // frame to the aspect ratio of the given dimensions before stretching. | 186 // frame to the aspect ratio of the given dimensions before stretching. |
| 182 virtual void StretchToPlanes( | 187 virtual void StretchToPlanes(uint8_t* y, |
| 183 uint8 *y, uint8 *u, uint8 *v, int32 pitchY, int32 pitchU, int32 pitchV, | 188 uint8_t* u, |
| 184 size_t width, size_t height, bool interpolate, bool crop) const; | 189 uint8_t* v, |
| 190 int32_t pitchY, |
| 191 int32_t pitchU, |
| 192 int32_t pitchV, |
| 193 size_t width, |
| 194 size_t height, |
| 195 bool interpolate, |
| 196 bool crop) const; |
| 185 | 197 |
| 186 // Writes the frame into the target VideoFrame, stretched to the size of that | 198 // Writes the frame into the target VideoFrame, stretched to the size of that |
| 187 // frame. The parameter "interpolate" controls whether to interpolate or just | 199 // frame. The parameter "interpolate" controls whether to interpolate or just |
| 188 // take the nearest-point. The parameter "crop" controls whether to crop this | 200 // take the nearest-point. The parameter "crop" controls whether to crop this |
| 189 // frame to the aspect ratio of the target frame before stretching. | 201 // frame to the aspect ratio of the target frame before stretching. |
| 190 virtual void StretchToFrame(VideoFrame *target, bool interpolate, | 202 virtual void StretchToFrame(VideoFrame *target, bool interpolate, |
| 191 bool crop) const; | 203 bool crop) const; |
| 192 | 204 |
| 193 // Stretches the frame to the given size, creating a new VideoFrame object to | 205 // Stretches the frame to the given size, creating a new VideoFrame object to |
| 194 // hold it. The parameter "interpolate" controls whether to interpolate or | 206 // hold it. The parameter "interpolate" controls whether to interpolate or |
| 195 // just take the nearest-point. The parameter "crop" controls whether to crop | 207 // just take the nearest-point. The parameter "crop" controls whether to crop |
| 196 // this frame to the aspect ratio of the given dimensions before stretching. | 208 // this frame to the aspect ratio of the given dimensions before stretching. |
| 197 virtual VideoFrame *Stretch(size_t w, size_t h, bool interpolate, | 209 virtual VideoFrame *Stretch(size_t w, size_t h, bool interpolate, |
| 198 bool crop) const; | 210 bool crop) const; |
| 199 | 211 |
| 200 // Sets the video frame to black. | 212 // Sets the video frame to black. |
| 201 virtual bool SetToBlack(); | 213 virtual bool SetToBlack(); |
| 202 | 214 |
| 203 // Tests if sample is valid. Returns true if valid. | 215 // Tests if sample is valid. Returns true if valid. |
| 204 static bool Validate(uint32 fourcc, int w, int h, const uint8 *sample, | 216 static bool Validate(uint32_t fourcc, |
| 217 int w, |
| 218 int h, |
| 219 const uint8_t* sample, |
| 205 size_t sample_size); | 220 size_t sample_size); |
| 206 | 221 |
| 207 // Size of an I420 image of given dimensions when stored as a frame buffer. | 222 // Size of an I420 image of given dimensions when stored as a frame buffer. |
| 208 static size_t SizeOf(size_t w, size_t h) { | 223 static size_t SizeOf(size_t w, size_t h) { |
| 209 return w * h + ((w + 1) / 2) * ((h + 1) / 2) * 2; | 224 return w * h + ((w + 1) / 2) * ((h + 1) / 2) * 2; |
| 210 } | 225 } |
| 211 | 226 |
| 212 protected: | 227 protected: |
| 213 // Creates an empty frame. | 228 // Creates an empty frame. |
| 214 virtual VideoFrame *CreateEmptyFrame(int w, int h, size_t pixel_width, | 229 virtual VideoFrame *CreateEmptyFrame(int w, int h, size_t pixel_width, |
| 215 size_t pixel_height, | 230 size_t pixel_height, |
| 216 int64_t time_stamp) const = 0; | 231 int64_t time_stamp) const = 0; |
| 217 virtual void SetRotation(webrtc::VideoRotation rotation) = 0; | 232 virtual void SetRotation(webrtc::VideoRotation rotation) = 0; |
| 218 }; | 233 }; |
| 219 | 234 |
| 220 } // namespace cricket | 235 } // namespace cricket |
| 221 | 236 |
| 222 #endif // TALK_MEDIA_BASE_VIDEOFRAME_H_ | 237 #endif // TALK_MEDIA_BASE_VIDEOFRAME_H_ |
| OLD | NEW |