/* * 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_ */