Gecko:MediaRecorder: Difference between revisions

Line 48: Line 48:
     Queue<MediaSegment> mBuffer;
     Queue<MediaSegment> mBuffer;
   
   
     friend class MediaCodec;
     friend class Encoder;
  }
  }


Line 154: Line 154:
     MediaSegmentAdapter mVideoSegments;
     MediaSegmentAdapter mVideoSegments;
     MediaSegmentAdapter mAudioSegments;
     MediaSegmentAdapter mAudioSegments;
     MediaCodec mVideoCodec;
     Encoder mVideoEncoder;
     MediaCodec mAudioCodec;
     Encoder mAudioEncoder;
     MediaWriter mWriter;
     MediaEncoder mMediaEncoder;
     Thread mEncoderThread;
     Thread mEncoderThread;
  }
  }
Line 184: Line 184:
   * utilize libopus API.
   * utilize libopus API.
   */
   */
  class MediaCodec {
  class Encoder {
  public:
  public:
     enum EncodingState {
     enum EncodingState {
Line 192: Line 192:
     }
     }
   
   
     MediaCodec();
     Encoder();
     nsresult Init() = 0;
     nsresult Init() = 0;
   
   
     /* Let MediaCodec setup buffer length based on codec characteristic
     /* Let Encoder setup buffer length based on codec characteristic
       e.g. Stagefright video codecs may only use 1 buffer since the buffer maybe shared between hardwares */
       e.g. Stagefright video codecs may only use 1 buffer since the buffer maybe shared between hardwares */
      
      
Line 221: Line 221:
  }
  }


  class AudioCodec : public MediaCodec {
  class AudioTrackEncoder : public Encoder {
  public:
  public:
     /* AudioCodec may need collect enough buffers to be encode, return COLLECT as needed */
     /* AudioCodec may need collect enough buffers to be encode, return COLLECT as needed */
Line 231: Line 231:
  }
  }


  class VideoCodec : public MediaCodec {
  class VideoTrackEncoder : public Encoder {
  public:  
  public:  
     EncoderStatus Encode(MediaBuffer in, void* out, size_t length) = 0;
     EncoderStatus Encode(MediaBuffer in, void* out, size_t length) = 0;
  }
  }


  class OpusCodec : public AudioCodec {
  class OpusEncoder : public AudioTrackEncoder {
     // Use libopus to encode audio
     // Use libopus to encode audio
  private:
  private:
Line 242: Line 242:
  }
  }


  class TheoraCodec : public VideoCodec {
  class TheoraEncoder : public VideoTrackEncoder {
     // Use libtheora to encode video
     // Use libtheora to encode video
  private:
  private:
Line 255: Line 255:
  class MediaWriter {
  class MediaWriter {
  public:
  public:
     void AddTrack(MediaCodec);
     void AddTrack(Encoder);
   
   
     /* Block until container packet write done*/
     /* Block until container packet write done*/
Line 263: Line 263:
  class OggWriter {
  class OggWriter {
     // Use libogg to write container
     // Use libogg to write container
  public:
  protected:
     // libogg context and others
     // libogg context and others
    VideoTrackEncoder mVideoEncoder; // e.g. TheoraEncoder
    AudioTrackEncoder mAudioEncoder; // e.g. OpusEncoder/VorbisEncoder
  }
  }
</code>
</code>
Confirmed users
157

edits