static GF_Err AC3_AttachStream(GF_BaseDecoder *ifcg, GF_ESD *esd) { A52CTX(); if (ctx->ES_ID && ctx->ES_ID!=esd->ESID) return GF_NOT_SUPPORTED; GF_LOG(GF_LOG_DEBUG, GF_LOG_CODEC, ("[A52] Attaching stream %d\n", esd->ESID)); if (ctx->codec) a52_free(ctx->codec); ctx->codec = a52_init(MM_ACCEL_DJBFFT); if (!ctx->codec) { GF_LOG(GF_LOG_ERROR, GF_LOG_CODEC, ("[A52] Error initializing decoder\n")); return GF_IO_ERR; } ctx->samples = a52_samples(ctx->codec); if (!ctx->samples) { a52_free(ctx->codec); GF_LOG(GF_LOG_ERROR, GF_LOG_CODEC, ("[A52] Error initializing decoder\n")); return GF_IO_ERR; } ctx->num_channels = 0; ctx->sample_rate = 0; ctx->out_size = 0; ctx->num_samples = 1536; ctx->ES_ID = esd->ESID; return GF_OK; }
static int liba52_init(adec_feeder_t * feeder) { uint32_t a52_accel = 0; int flags = 0; c_feeder = feeder; if (feeder == NULL) return -1; memset(&a52_buffer, 0, sizeof(a52_buffer)); a52_buffer.a_in_buffer = frame_buffer; a52_state = a52_init(a52_accel); if (a52_state == NULL) { printf("A52 init failed !\n"); return -1; } if (a52_fillbuff(&a52_buffer) < 0) { printf("A52 sync failed !\n"); return -1; } a52_buffer.channels = audio_output_channels; switch (a52_buffer.channels) { case 1: a52_flags = A52_MONO; break; /*case 2: a52_flags=A52_STEREO; break; */ case 2: a52_flags = A52_DOLBY; break; /*case 3: a52_flags=A52_3F; break; */ case 3: a52_flags = A52_2F1R; break; case 4: a52_flags = A52_2F2R; break; /* 2+2 */ case 5: a52_flags = A52_3F2R; break; case 6: a52_flags = A52_3F2R | A52_LFE; break; /* 5.1 */ } flags |= a52_flags; if (a52_resample_init(a52_accel, flags, a52_buffer.channels) < 0) { printf("a52_resample_init failed!\n"); a52_free(a52_state); return -1; } feeder->channel_num = audio_output_channels; feeder->sample_rate = a52_buffer.samplerate; return 0; }
/***************************************************************************** * CloseFilter : deallocate data structures *****************************************************************************/ static void CloseFilter( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys = p_filter->p_sys; a52_free( p_sys->p_liba52 ); free( p_sys ); }
/***************************************************************************** * Destroy : deallocate data structures *****************************************************************************/ static void Destroy( vlc_object_t *p_this ) { aout_filter_t *p_filter = (aout_filter_t *)p_this; filter_sys_t *p_sys = (filter_sys_t *)p_filter->p_sys; a52_free( p_sys->p_liba52 ); free( p_sys ); }
ADM_AudiocodecAC3::~ADM_AudiocodecAC3( ) { if(ac3_handle) { a52_free(AC3_HANDLE); ac3_handle=NULL; ac3_sample=NULL; } }
TaudioCodecLiba52::~TaudioCodecLiba52() { if (dll) { if (state) { a52_free(state); } delete dll; } }
static int a52_decode_release(void) { if (a52_state) { a52_free(a52_state); a52_state = NULL; } memset(frame_buffer, 0, 3840); return 0; }
static GstStateChangeReturn gst_a52dec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstA52Dec *a52dec = GST_A52DEC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY:{ GstA52DecClass *klass; klass = GST_A52DEC_CLASS (G_OBJECT_GET_CLASS (a52dec)); a52dec->state = a52_init (klass->a52_cpuflags); break; } case GST_STATE_CHANGE_READY_TO_PAUSED: a52dec->samples = a52_samples (a52dec->state); a52dec->bit_rate = -1; a52dec->sample_rate = -1; a52dec->stream_channels = A52_CHANNEL; a52dec->using_channels = A52_CHANNEL; a52dec->level = 1; a52dec->bias = 0; a52dec->time = 0; a52dec->sent_segment = FALSE; a52dec->flag_update = TRUE; gst_segment_init (&a52dec->segment, GST_FORMAT_UNDEFINED); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: a52dec->samples = NULL; if (a52dec->cache) { gst_buffer_unref (a52dec->cache); a52dec->cache = NULL; } clear_queued (a52dec); break; case GST_STATE_CHANGE_READY_TO_NULL: a52_free (a52dec->state); a52dec->state = NULL; break; default: break; } return ret; }
static GF_Err AC3_DetachStream(GF_BaseDecoder *ifcg, u16 ES_ID) { A52CTX(); if (ES_ID != ctx->ES_ID) return GF_BAD_PARAM; if (ctx->codec) a52_free(ctx->codec); ctx->codec = NULL; ctx->ES_ID = 0; ctx->sample_rate = ctx->out_size = ctx->num_samples = 0; ctx->num_channels = 0; return GF_OK; }
/* this is the codec entry point */ enum codec_status codec_main(enum codec_entry_call_reason reason) { if (reason == CODEC_LOAD) { /* Generic codec initialisation */ ci->configure(DSP_SET_STEREO_MODE, STEREO_NONINTERLEAVED); ci->configure(DSP_SET_SAMPLE_DEPTH, 28); } else if (reason == CODEC_UNLOAD) { if (state) a52_free(state); } return CODEC_OK; }
void DeleteAC3Dec(GF_BaseDecoder *ifcg) { AC3Dec *ctx; if (!ifcg) return; ctx = (AC3Dec *) ifcg->privateStack; if (ctx){ if (ctx->codec) a52_free(ctx->codec); ctx->codec = NULL; gf_free(ctx); ifcg->privateStack = NULL; } gf_free(ifcg); }
static gboolean gst_a52dec_stop (GstAudioDecoder * dec) { GstA52Dec *a52dec = GST_A52DEC (dec); GST_DEBUG_OBJECT (dec, "stop"); a52dec->samples = NULL; if (a52dec->state) { a52_free (a52dec->state); a52dec->state = NULL; } return TRUE; }
static void uninit(sh_audio_t *sh) { a52_free(a52_state); }
/* this is the codec entry point */ enum codec_status codec_main(void) { size_t n; unsigned char *filebuf; int sample_loc; int retval; /* Generic codec initialisation */ ci->configure(DSP_SET_STEREO_MODE, STEREO_NONINTERLEAVED); ci->configure(DSP_SET_SAMPLE_DEPTH, 28); next_track: retval = CODEC_OK; if (codec_init()) { retval = CODEC_ERROR; goto exit; } if (codec_wait_taginfo() != 0) goto request_next_track; ci->configure(DSP_SWITCH_FREQUENCY, ci->id3->frequency); codec_set_replaygain(ci->id3); /* Intialise the A52 decoder and check for success */ state = a52_init(0); /* The main decoding loop */ if (ci->id3->offset) { if (ci->seek_buffer(ci->id3->offset)) { samplesdone = (ci->id3->offset / ci->id3->bytesperframe) * A52_SAMPLESPERFRAME; ci->set_elapsed(samplesdone/(ci->id3->frequency / 1000)); } } else { samplesdone = 0; } while (1) { if (ci->stop_codec || ci->new_track) break; if (ci->seek_time) { sample_loc = (ci->seek_time - 1)/1000 * ci->id3->frequency; if (ci->seek_buffer((sample_loc/A52_SAMPLESPERFRAME)*ci->id3->bytesperframe)) { samplesdone = sample_loc; ci->set_elapsed(samplesdone/(ci->id3->frequency/1000)); } ci->seek_complete(); } filebuf = ci->request_buffer(&n, BUFFER_SIZE); if (n == 0) /* End of Stream */ break; a52_decode_data(filebuf, filebuf + n); ci->advance_buffer(n); } request_next_track: if (ci->request_next_track()) goto next_track; exit: a52_free(state); return retval; }
void mpeg3_delete_ac3(mpeg3_ac3_t *audio) { mpeg3bits_delete_stream(audio->stream); a52_free(audio->state); free(audio); }