OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/base/video_frame.h" | 5 #include "media/base/video_frame.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <climits> | 8 #include <climits> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
193 return 1; | 193 return 1; |
194 case PIXEL_FORMAT_MJPEG: | 194 case PIXEL_FORMAT_MJPEG: |
195 return 0; | 195 return 0; |
196 case PIXEL_FORMAT_UNKNOWN: | 196 case PIXEL_FORMAT_UNKNOWN: |
197 break; | 197 break; |
198 } | 198 } |
199 NOTREACHED(); | 199 NOTREACHED(); |
200 return 0; | 200 return 0; |
201 } | 201 } |
202 | 202 |
203 // Checks if |source_format| can be wrapped into a |target_format| frame. | |
204 static bool AreValidPixelFormatsForWrap(VideoPixelFormat source_format, | |
205 VideoPixelFormat target_format) { | |
206 if (source_format == target_format) | |
207 return true; | |
208 | |
209 switch (source_format) { | |
210 case PIXEL_FORMAT_YV12A: | |
211 switch (target_format) { | |
212 case PIXEL_FORMAT_I420: | |
213 return true; | |
214 default: | |
215 return false; | |
216 } | |
217 default: | |
218 return false; | |
219 } | |
mcasas
2016/02/29 23:48:01
Hmm actually I'd say either they are the same
form
emircan
2016/03/01 20:07:55
l.206 covers the previously supported cases.
For
mcasas
2016/03/02 22:01:10
SG。I'd say just add a comment saying that
nothing
emircan
2016/03/03 22:05:58
Done.
| |
220 } | |
221 | |
203 // static | 222 // static |
204 bool VideoFrame::IsValidConfig(VideoPixelFormat format, | 223 bool VideoFrame::IsValidConfig(VideoPixelFormat format, |
205 StorageType storage_type, | 224 StorageType storage_type, |
206 const gfx::Size& coded_size, | 225 const gfx::Size& coded_size, |
207 const gfx::Rect& visible_rect, | 226 const gfx::Rect& visible_rect, |
208 const gfx::Size& natural_size) { | 227 const gfx::Size& natural_size) { |
209 // Check maximum limits for all formats. | 228 // Check maximum limits for all formats. |
210 int coded_size_area = coded_size.GetCheckedArea().ValueOrDefault(INT_MAX); | 229 int coded_size_area = coded_size.GetCheckedArea().ValueOrDefault(INT_MAX); |
211 int natural_size_area = natural_size.GetCheckedArea().ValueOrDefault(INT_MAX); | 230 int natural_size_area = natural_size.GetCheckedArea().ValueOrDefault(INT_MAX); |
212 static_assert(limits::kMaxCanvas < INT_MAX, ""); | 231 static_assert(limits::kMaxCanvas < INT_MAX, ""); |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
488 scoped_refptr<VideoFrame> frame(new VideoFrame( | 507 scoped_refptr<VideoFrame> frame(new VideoFrame( |
489 format, storage, coded_size, visible_rect, natural_size, timestamp)); | 508 format, storage, coded_size, visible_rect, natural_size, timestamp)); |
490 | 509 |
491 frame->cv_pixel_buffer_.reset(cv_pixel_buffer, base::scoped_policy::RETAIN); | 510 frame->cv_pixel_buffer_.reset(cv_pixel_buffer, base::scoped_policy::RETAIN); |
492 return frame; | 511 return frame; |
493 } | 512 } |
494 #endif | 513 #endif |
495 | 514 |
496 // static | 515 // static |
497 scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame( | 516 scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame( |
498 const scoped_refptr<VideoFrame>& frame, | 517 const scoped_refptr<VideoFrame>& frame, |
499 const gfx::Rect& visible_rect, | 518 VideoPixelFormat format, |
500 const gfx::Size& natural_size) { | 519 const gfx::Rect& visible_rect, |
520 const gfx::Size& natural_size) { | |
501 // Frames with textures need mailbox info propagated, and there's no support | 521 // Frames with textures need mailbox info propagated, and there's no support |
502 // for that here yet, see http://crbug/362521. | 522 // for that here yet, see http://crbug/362521. |
503 CHECK(!frame->HasTextures()); | 523 CHECK(!frame->HasTextures()); |
504 | |
505 DCHECK(frame->visible_rect().Contains(visible_rect)); | 524 DCHECK(frame->visible_rect().Contains(visible_rect)); |
506 | 525 |
507 if (!IsValidConfig(frame->format(), frame->storage_type(), | 526 if (!AreValidPixelFormatsForWrap(frame->format(), format)) { |
508 frame->coded_size(), visible_rect, natural_size)) { | 527 LOG(DFATAL) << __FUNCTION__ << " Invalid formats." |
mcasas
2016/02/29 23:48:01
s/formats./format conversion: /
emircan
2016/03/01 20:07:55
Done.
| |
528 << VideoPixelFormatToString(frame->format()) << " to " | |
529 << VideoPixelFormatToString(format); | |
530 return nullptr; | |
531 } | |
532 | |
533 if (!IsValidConfig(format, frame->storage_type(), frame->coded_size(), | |
534 visible_rect, natural_size)) { | |
509 LOG(DFATAL) << __FUNCTION__ << " Invalid config." | 535 LOG(DFATAL) << __FUNCTION__ << " Invalid config." |
510 << ConfigToString(frame->format(), frame->storage_type(), | 536 << ConfigToString(format, frame->storage_type(), |
511 frame->coded_size(), visible_rect, | 537 frame->coded_size(), visible_rect, |
512 natural_size); | 538 natural_size); |
513 return nullptr; | 539 return nullptr; |
514 } | 540 } |
515 | 541 |
516 scoped_refptr<VideoFrame> wrapping_frame(new VideoFrame( | 542 scoped_refptr<VideoFrame> wrapping_frame( |
517 frame->format(), frame->storage_type(), frame->coded_size(), visible_rect, | 543 new VideoFrame(format, frame->storage_type(), frame->coded_size(), |
518 natural_size, frame->timestamp())); | 544 visible_rect, natural_size, frame->timestamp())); |
519 if (frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)) { | 545 if (frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)) { |
520 wrapping_frame->metadata()->SetBoolean(VideoFrameMetadata::END_OF_STREAM, | 546 wrapping_frame->metadata()->SetBoolean(VideoFrameMetadata::END_OF_STREAM, |
521 true); | 547 true); |
522 } | 548 } |
mcasas
2016/02/29 23:48:01
nit: Maybe we should copy all VideoFrameMetadata::
emircan
2016/03/01 20:07:55
Done.
| |
523 | 549 |
524 for (size_t i = 0; i < NumPlanes(frame->format()); ++i) { | 550 for (size_t i = 0; i < NumPlanes(format); ++i) { |
525 wrapping_frame->strides_[i] = frame->stride(i); | 551 wrapping_frame->strides_[i] = frame->stride(i); |
526 wrapping_frame->data_[i] = frame->data(i); | 552 wrapping_frame->data_[i] = frame->data(i); |
527 } | 553 } |
528 | 554 |
529 #if defined(OS_LINUX) | 555 #if defined(OS_LINUX) |
530 // If there are any |dmabuf_fds_| plugged in, we should duplicate them. | 556 // If there are any |dmabuf_fds_| plugged in, we should duplicate them. |
531 if (frame->storage_type() == STORAGE_DMABUFS) { | 557 if (frame->storage_type() == STORAGE_DMABUFS) { |
532 std::vector<int> original_fds; | 558 std::vector<int> original_fds; |
533 for (size_t i = 0; i < kMaxPlanes; ++i) | 559 for (size_t i = 0; i < kMaxPlanes; ++i) |
534 original_fds.push_back(frame->dmabuf_fd(i)); | 560 original_fds.push_back(frame->dmabuf_fd(i)); |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1080 if (zero_initialize_memory) | 1106 if (zero_initialize_memory) |
1081 memset(data, 0, data_size); | 1107 memset(data, 0, data_size); |
1082 | 1108 |
1083 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) | 1109 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) |
1084 data_[plane] = data + offset[plane]; | 1110 data_[plane] = data + offset[plane]; |
1085 | 1111 |
1086 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); | 1112 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); |
1087 } | 1113 } |
1088 | 1114 |
1089 } // namespace media | 1115 } // namespace media |
OLD | NEW |