void on_audio_in(const void* input, unsigned long nframes, void* user) { #if USE_AUDIO AVPacket* au_pkt = mempool.getFreeAudioPacket(); if(au_pkt) { uint8_t* ptr = (uint8_t*)input; size_t nbytes = nframes * sizeof(short int) * 2; au_pkt->data.assign(ptr, ptr + nbytes); au_pkt->setTimeStamp(tp.getTimeStamp()); vs.addAudio(au_pkt); } #endif }
int main() { std::string settings_file = rx_get_exe_path() +"connection_test.xml"; if(!vs.loadSettings(settings_file)) { STREAMER_ERROR("error: cannot find the connection_test.xml file: %s.", settings_file.c_str()); ::exit(EXIT_FAILURE); } #if MIC_IN AudioSettings audio_settings; audio_settings.samplerate = AV_AUDIO_SAMPLERATE_44100; audio_settings.mode = AV_AUDIO_MODE_STEREO; audio_settings.bitsize = AV_AUDIO_BITSIZE_S16; audio_settings.quality = 6; audio_settings.bitrate = 64; audio_settings.in_bitsize = AV_AUDIO_BITSIZE_S16; audio_settings.in_interleaved = true; PAudio paudio; paudio.listDevices(); if(!paudio.openInputStream(paudio.getDefaultInputDevice(), 2, paInt16, 44100, 512)) { STREAMER_ERROR("error: cannot set port audio."); ::exit(EXIT_FAILURE); } STREAMER_VERBOSE("Using input audio device: %d.", paudio.getDefaultInputDevice()); paudio.setCallback(on_audio_in, NULL); vs.setAudioSettings(audio_settings); //std::string output_file = rx_get_exe_path() +"test.flv"; //vs.setOutputFile(output_file); #endif if(!tp.setup(vs.getVideoWidth(), vs.getVideoHeight(), vs.getFrameRate(), vs.getSampleRate())) { STREAMER_ERROR("error: cannot setup the test pattern."); ::exit(EXIT_FAILURE); } STREAMER_VERBOSE("Loaded streamer with: %d x %d @ %d, samplerate: %d.", vs.getVideoWidth(), vs.getVideoHeight(), vs.getFrameRate(), vs.getSampleRate()); mempool.allocateVideoFrames(10, tp.getNumVideoBytes()); mempool.allocateAudioFrames(512, tp.getNumAudioBytes()); signal(SIGINT, sighandler); if(!vs.setup()) { ::exit(EXIT_FAILURE); } if(!vs.start()) { ::exit(EXIT_FAILURE); } #if MIC_IN paudio.start(); #endif tp.start(); int nbytes_video = vs.getVideoWidth() * vs.getVideoHeight() + (2 * (vs.getVideoWidth() * 0.5) * (vs.getVideoHeight() * 0.5)); must_run = true; while(must_run) { tp.update(); if(tp.hasVideoFrame()) { AVPacket* vid_pkt = mempool.getFreeVideoPacket(); // packet is owned by memory pool and released by if(vid_pkt) { tp.generateVideoFrame(vid_pkt->data, vid_pkt->planes, vid_pkt->strides); vid_pkt->makeVideoPacket(); vid_pkt->setTimeStamp(tp.getTimeStamp()); vs.addVideo(vid_pkt); } } #if MIC_IN == 0 && USE_AUDIO == 1 if(tp.hasAudioFrame()) { AVPacket* au_pkt = mempool.getFreeAudioPacket(); if(au_pkt) { tp.generateAudioFrame(au_pkt->data); au_pkt->setTimeStamp(tp.getTimeStamp()); vs.addAudio(au_pkt); } else { STREAMER_ERROR("error: cannot get new audio frame."); } } #endif } #if MIC_IN paudio.stop(); #endif return EXIT_SUCCESS; }