root/applications/dashcast/audio_muxer.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 *                      GPAC - Multimedia Framework C SDK
 *
 *                      Authors: Arash Shafiei
 *                      Copyright (c) Telecom ParisTech 2000-2013
 *                                      All rights reserved
 *
 *  This file is part of GPAC / dashcast
 *
 *  GPAC is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  GPAC is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#ifndef AUDIO_MUXER_H_
#define AUDIO_MUXER_H_

#include <stdlib.h>
#include "../../modules/ffmpeg_in/ffmpeg_in.h"
#include "libavutil/fifo.h"
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
#ifdef DC_AUDIO_RESAMPLER
#include "libavresample/avresample.h"
#endif
#include "libavutil/mathematics.h"
#include "libavutil/opt.h"
#include <gpac/isomedia.h>
#include <gpac/internal/media_dev.h>
#include <gpac/constants.h>
#include "audio_data.h"


typedef enum {
        FFMPEG_AUDIO_MUXER,
        GPAC_AUDIO_MUXER,
        GPAC_INIT_AUDIO_MUXER
} AudioMuxerType;

/*
 * AudioOutputFile structure has the data needed
 * to encode audio samples and write them on the file.
 * It reads the data from a circular buffer so it needs
 * to keep the index to that circular buffer. This index is
 * available in Consumer data structure.
 *
 */
typedef struct {
        AudioDataConf *audio_data_conf;

        /* File format context structure */
        AVFormatContext *av_fmt_ctx;
        AVCodec *codec;
        AVCodecContext *codec_ctx;

#ifndef GPAC_DISABLE_ISOM
        GF_ISOFile *isof;
        GF_ISOSample *sample;
#endif

        int dts;

        /* The index to the audio stream in the file */
        int astream_idx;

        /* It keeps the index with which encoder access to the circular buffer (as a consumer) */
        Consumer consumer;

#ifdef DC_AUDIO_RESAMPLER
        /* Optional audio resampling between the decoder and the encoder */
        AVAudioResampleContext *aresampler;
#endif

        /* Variables that encoder needs to encode data */
        AVFrame *aframe;
        uint8_t *adata_buf;
        int frame_bytes;
        AVPacket packet;

        /*
         * Audio samples stored in the AVFrame are not always
         * complete. Which means more than 1 AVFrame is needed
         * to complete an access unit. This fifo is provided
         * to store audio samples in the fifo and once an access unit
         * is complete we can encode it.
         */
        AVFifoBuffer *fifo;

        AudioMuxerType muxer_type;

        /* Accumulated sample */
        //int acc_samples;

        int frame_per_seg;
        int frame_per_frag;
        int first_dts;

        u32 seg_marker;
        u64 frame_ntp;
} AudioOutputFile;

int dc_audio_muxer_init(AudioOutputFile *audio_output_file, AudioDataConf *audio_data_conf, AudioMuxerType muxer_type, int frame_per_seg, int frame_per_frag, u32 seg_marker);
void dc_audio_muxer_free(AudioOutputFile *audio_output_file);

/*
 * Open the output audio
 *
 * @param audio_output_file [out] open the audio output on this file
 *
 * @param audio_data_conf [in] the structure containing the
 * configuration of the output file (bitrate, samplerate, name, channels)
 *
 * @return 0 on success, -1 on failure
 */
GF_Err dc_audio_muxer_open(AudioOutputFile *audio_output_file, char *directory, char *id_name, int seg);

GF_Err dc_audio_muxer_write(AudioOutputFile *audio_output_file, int frame_nb, Bool insert_ntp);

GF_Err dc_audio_muxer_close(AudioOutputFile *audio_output_file);

#endif /* AUDIO_MUXER_H_ */

/* [<][>][^][v][top][bottom][index][help] */