OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef SERVICES_MEDIA_AUDIO_AUDIO_PIPE_H_ |
| 6 #define SERVICES_MEDIA_AUDIO_AUDIO_PIPE_H_ |
| 7 |
| 8 #include <memory> |
| 9 #include <vector> |
| 10 |
| 11 #include "mojo/services/media/common/cpp/linear_transform.h" |
| 12 #include "services/media/audio/fwd_decls.h" |
| 13 #include "services/media/common/media_pipe_base.h" |
| 14 |
| 15 namespace mojo { |
| 16 namespace media { |
| 17 namespace audio { |
| 18 |
| 19 class AudioPipe : public MediaPipeBase { |
| 20 public: |
| 21 class AudioPacketRef; |
| 22 using AudioPacketRefPtr = std::shared_ptr<AudioPacketRef>; |
| 23 using MediaPacketStatePtr = MediaPipeBase::MediaPacketStatePtr; |
| 24 |
| 25 class AudioPacketRef { |
| 26 public: |
| 27 struct Region { |
| 28 Region(const void* b, uint32_t ffl) : base(b), frac_frame_len(ffl) {} |
| 29 const void* base; |
| 30 uint32_t frac_frame_len; |
| 31 }; |
| 32 |
| 33 ~AudioPacketRef(); |
| 34 |
| 35 const MediaPacketPtr& GetPacket() const { return state_->GetPacket(); } |
| 36 void SetResult(MediaResult result) { return state_->SetResult(result); } |
| 37 |
| 38 // Accessors for starting and ending presentation time stamps expressed in |
| 39 // units of audio frames (note, not media time), as signed 51.12 fixed point |
| 40 // integers (see AudioTrackImpl:PTS_FRACTIONAL_BITS). At 192KHz, this |
| 41 // allows for ~372.7 years of usable range when starting from a media time |
| 42 // of 0. |
| 43 // |
| 44 // AudioPackets consumed by the AudioServer are all expected to have |
| 45 // explicit presentation time stamps. If packets sent by the user are |
| 46 // missing timestamps, appropriate timestamps will be synthesized at this |
| 47 // point in the pipeline. |
| 48 // |
| 49 // Note, the start pts is the time at which the first frame of audio in the |
| 50 // packet should be presented. The end_pts is the time at which the frame |
| 51 // after the final frame in the packet would be presented. |
| 52 // |
| 53 // TODO(johngro): Reconsider this. It may be best to keep things expressed |
| 54 // simply in media time instead of converting to fractional units of track |
| 55 // frames. If/when outputs move away from a single fixed step size for |
| 56 // output sampling, it will probably be best to just convert this back to |
| 57 // media time. |
| 58 const int64_t& start_pts() const { return start_pts_; } |
| 59 const int64_t& end_pts() const { return end_pts_; } |
| 60 |
| 61 // Accessor for the regions in the shared buffer which contain the actual |
| 62 // sample data. |
| 63 const std::vector<Region>& regions() const { return regions_; } |
| 64 |
| 65 private: |
| 66 friend class AudioPipe; |
| 67 AudioPacketRef(MediaPacketStatePtr state, |
| 68 AudioServerImpl* server, |
| 69 std::vector<Region>&& regions, // NOLINT(build/c++11) |
| 70 int64_t start_pts, |
| 71 int64_t end_pts); |
| 72 |
| 73 MediaPacketStatePtr state_; |
| 74 AudioServerImpl* server_; |
| 75 |
| 76 std::vector<Region> regions_; |
| 77 int64_t start_pts_; |
| 78 int64_t end_pts_; |
| 79 }; |
| 80 |
| 81 AudioPipe(AudioTrackImpl* owner, AudioServerImpl* server); |
| 82 ~AudioPipe() override; |
| 83 |
| 84 protected: |
| 85 void OnPacketReceived(MediaPacketStatePtr state) override; |
| 86 void OnFlushRequested(const FlushCallback& cbk) override; |
| 87 |
| 88 private: |
| 89 AudioTrackImpl* owner_; |
| 90 AudioServerImpl* server_; |
| 91 |
| 92 // State used for timestamp interpolation |
| 93 bool next_pts_known_ = 0; |
| 94 int64_t next_pts_; |
| 95 }; |
| 96 |
| 97 } // namespace audio |
| 98 } // namespace media |
| 99 } // namespace mojo |
| 100 |
| 101 #endif // SERVICES_MEDIA_AUDIO_AUDIO_PIPE_H_ |
OLD | NEW |