Home | History | Annotate | Download | only in framer
      1 // Copyright 2013 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 MEDIA_CAST_FRAMER_FRAMER_H_
      6 #define MEDIA_CAST_FRAMER_FRAMER_H_
      7 
      8 #include <map>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/linked_ptr.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/time/tick_clock.h"
     14 #include "base/time/time.h"
     15 #include "media/cast/framer/cast_message_builder.h"
     16 #include "media/cast/framer/frame_buffer.h"
     17 #include "media/cast/framer/frame_id_map.h"
     18 #include "media/cast/rtcp/rtcp.h"
     19 #include "media/cast/rtp_receiver/rtp_receiver_defines.h"
     20 
     21 namespace media {
     22 namespace cast {
     23 
     24 typedef std::map<uint32, linked_ptr<FrameBuffer> > FrameList;
     25 
     26 class Framer {
     27  public:
     28   Framer(base::TickClock* clock,
     29          RtpPayloadFeedback* incoming_payload_feedback,
     30          uint32 ssrc,
     31          bool decoder_faster_than_max_frame_rate,
     32          int max_unacked_frames);
     33   ~Framer();
     34 
     35   // Return true when receiving the last packet in a frame, creating a
     36   // complete frame.
     37   bool InsertPacket(const uint8* payload_data,
     38                     size_t payload_size,
     39                     const RtpCastHeader& rtp_header);
     40 
     41   // Extracts a complete encoded frame - will only return a complete continuous
     42   // frame.
     43   // Returns false if the frame does not exist or if the frame is not complete
     44   // within the given time frame.
     45   bool GetEncodedVideoFrame(EncodedVideoFrame* video_frame,
     46                             uint32* rtp_timestamp,
     47                             bool* next_frame);
     48 
     49   bool GetEncodedAudioFrame(EncodedAudioFrame* audio_frame,
     50                             uint32* rtp_timestamp,
     51                             bool* next_frame);
     52 
     53   void ReleaseFrame(uint32 frame_id);
     54 
     55   // Reset framer state to original state and flush all pending buffers.
     56   void Reset();
     57   bool TimeToSendNextCastMessage(base::TimeTicks* time_to_send);
     58   void SendCastMessage();
     59 
     60  private:
     61   const bool decoder_faster_than_max_frame_rate_;
     62   FrameList frames_;
     63   FrameIdMap frame_id_map_;
     64 
     65   scoped_ptr<CastMessageBuilder> cast_msg_builder_;
     66 
     67   DISALLOW_COPY_AND_ASSIGN(Framer);
     68 };
     69 
     70 }  //  namespace cast
     71 }  //  namespace media
     72 
     73 #endif  // MEDIA_CAST_FRAMER_FRAMER_H_
     74