/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_UTILITY_INTERFACE_FILE_RECORDER_H_
#define WEBRTC_MODULES_UTILITY_INTERFACE_FILE_RECORDER_H_

#include "audio_coding_module_typedefs.h"
#include "common_types.h"
#include "engine_configurations.h"
#include "media_file_defines.h"
#include "module_common_types.h"
#include "tick_util.h"
#include "typedefs.h"

namespace webrtc {

class FileRecorder
{
public:

    // Note: will return NULL for video file formats (e.g. AVI) if the flag
    //       WEBRTC_MODULE_UTILITY_VIDEO is not defined.
    static FileRecorder* CreateFileRecorder(const WebRtc_UWord32 instanceID,
                                            const FileFormats fileFormat);

    static void DestroyFileRecorder(FileRecorder* recorder);

    virtual WebRtc_Word32 RegisterModuleFileCallback(
        FileCallback* callback) = 0;

    virtual FileFormats RecordingFileFormat() const = 0;

    virtual WebRtc_Word32 StartRecordingAudioFile(
        const WebRtc_Word8* fileName,
        const CodecInst& codecInst,
        WebRtc_UWord32 notification,
        ACMAMRPackingFormat amrFormat = AMRFileStorage) = 0;

    virtual WebRtc_Word32 StartRecordingAudioFile(
        OutStream& destStream,
        const CodecInst& codecInst,
        WebRtc_UWord32 notification,
        ACMAMRPackingFormat amrFormat = AMRFileStorage) = 0;

    // Stop recording.
    // Note: this API is for both audio and video.
    virtual WebRtc_Word32 StopRecording() = 0;

    // Return true if recording.
    // Note: this API is for both audio and video.
    virtual bool IsRecording() const = 0;

    virtual WebRtc_Word32 codec_info(CodecInst& codecInst) const = 0;

    // Write frame to file. Frame should contain 10ms of un-ecoded audio data.
    virtual WebRtc_Word32 RecordAudioToFile(
        const AudioFrame& frame,
        const TickTime* playoutTS = NULL) = 0;

    // Open/create the file specified by fileName for writing audio/video data
    // (relative path is allowed). audioCodecInst specifies the encoding of the
    // audio data. videoCodecInst specifies the encoding of the video data.
    // Only video data will be recorded if videoOnly is true. amrFormat
    // specifies the amr/amrwb storage format.
    // Note: the file format is AVI.
    virtual WebRtc_Word32 StartRecordingVideoFile(
        const WebRtc_Word8* fileName,
        const CodecInst& audioCodecInst,
        const VideoCodec& videoCodecInst,
        ACMAMRPackingFormat amrFormat = AMRFileStorage,
        bool videoOnly = false) = 0;

    // Record the video frame in videoFrame to AVI file.
    virtual WebRtc_Word32 RecordVideoToFile(const VideoFrame& videoFrame) = 0;

protected:
    virtual ~FileRecorder() {}

};
} // namespace webrtc
#endif // WEBRTC_MODULES_UTILITY_INTERFACE_FILE_RECORDER_H_
