Code Search for Developers
 
 
  

ad_ffmpeg.c from The Open2x Project at Krugle


Show ad_ffmpeg.c syntax highlighted

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "config.h"
#include "mp_msg.h"
#include "help_mp.h"

#ifdef USE_LIBAVCODEC

#include "ad_internal.h"

#include "bswap.h"

static ad_info_t info = 
{
	"FFmpeg/libavcodec audio decoders",
	"ffmpeg",
	"Nick Kurshev",
	"ffmpeg.sf.net",
	""
};

LIBAD_EXTERN(ffmpeg)

#define assert(x)

#ifdef USE_LIBAVCODEC_SO
#include <ffmpeg/avcodec.h>
#else
#include "libavcodec/avcodec.h"
#endif

// ghcstop_caution: 20050131 libavcodecÀ» »ì¸®¸é¼­ 
#if 0
	extern int avcodec_inited; // vd_ffmpeg.c¿¡ ÀÖ´Â °ÍÀε¥, vdÂÊÀ» ´Ù »©¹ö·ÈÀ¸¹Ç·Î
#else
	int avcodec_inited=0; // ¿©±â¼­ Á÷Á¢ ¼±¾ðÇÑ´Ù.
#endif

static int preinit(sh_audio_t *sh)
{
  sh->audio_out_minsize=AVCODEC_MAX_AUDIO_FRAME_SIZE;
  return 1;
}

static int init(sh_audio_t *sh_audio)
{
    int x;
    AVCodecContext *lavc_context;
    AVCodec *lavc_codec;

    mp_msg(MSGT_DECAUDIO,MSGL_V,"FFmpeg's libavcodec audio codec\n");
    if(!avcodec_inited){
      avcodec_init();
      avcodec_register_all();
      avcodec_inited=1;
    }
    
    lavc_codec = (AVCodec *)avcodec_find_decoder_by_name(sh_audio->codec->dll);
    if(!lavc_codec){
	mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_MissingLAVCcodec,sh_audio->codec->dll);
	return 0;
    }
    
    lavc_context = avcodec_alloc_context();
    sh_audio->context=lavc_context;

    if(sh_audio->wf){
	lavc_context->channels = sh_audio->wf->nChannels;
	lavc_context->sample_rate = sh_audio->wf->nSamplesPerSec;
	lavc_context->bit_rate = sh_audio->wf->nAvgBytesPerSec * 8;
	lavc_context->block_align = sh_audio->wf->nBlockAlign;
    }
    lavc_context->codec_tag = sh_audio->format; //FOURCC
    lavc_context->codec_id = lavc_codec->id; // not sure if required, imho not --A'rpi

    /* alloc extra data */
    if (sh_audio->wf && sh_audio->wf->cbSize > 0) {
        lavc_context->extradata = malloc(sh_audio->wf->cbSize);
        lavc_context->extradata_size = sh_audio->wf->cbSize;
        memcpy(lavc_context->extradata, (char *)sh_audio->wf + sizeof(WAVEFORMATEX), 
               lavc_context->extradata_size);
    }

    /* open it */
    if (avcodec_open(lavc_context, lavc_codec) < 0) {
        mp_msg(MSGT_DECAUDIO,MSGL_ERR, MSGTR_CantOpenCodec);
        return 0;
    }
   mp_msg(MSGT_DECAUDIO,MSGL_V,"INFO: libavcodec init OK!\n");
   
//   printf("\nFOURCC: 0x%X\n",sh_audio->format);
   if(sh_audio->format==0x3343414D){
       // MACE 3:1
       sh_audio->ds->ss_div = 2*3; // 1 samples/packet
       sh_audio->ds->ss_mul = 2*sh_audio->wf->nChannels; // 1 byte*ch/packet
   } else
   if(sh_audio->format==0x3643414D){
       // MACE 6:1
       sh_audio->ds->ss_div = 2*6; // 1 samples/packet
       sh_audio->ds->ss_mul = 2*sh_audio->wf->nChannels; // 1 byte*ch/packet
   }

   // Decode at least 1 byte:  (to get header filled)
   x=decode_audio(sh_audio,sh_audio->a_buffer,1,sh_audio->a_buffer_size);
   if(x>0) sh_audio->a_buffer_len=x;

#if 1
  sh_audio->channels=lavc_context->channels;
  sh_audio->samplerate=lavc_context->sample_rate;
  sh_audio->i_bps=lavc_context->bit_rate/8;
#else
  sh_audio->channels=sh_audio->wf->nChannels;
  sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
  sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec;
#endif
  sh_audio->samplesize=2;
  return 1;
}

static void uninit(sh_audio_t *sh)
{
    AVCodecContext *lavc_context = sh->context;

    if (avcodec_close(lavc_context) < 0)
	mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantCloseCodec);
    if (lavc_context->extradata)
        free(lavc_context->extradata);
    free(lavc_context);
}

static int control(sh_audio_t *sh,int cmd,void* arg, ...)
{
    AVCodecContext *lavc_context = sh->context;
    switch(cmd){
    case ADCTRL_RESYNC_STREAM:
        avcodec_flush_buffers(lavc_context);
    return CONTROL_TRUE;
    }
    return CONTROL_UNKNOWN;
}

static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
{
    unsigned char *start=NULL;
    int y,len=-1;
    while(len<minlen){
	int len2=0;
	int x=ds_get_packet(sh_audio->ds,&start);
	if(x<=0) break; // error
	y=avcodec_decode_audio(sh_audio->context,(int16_t*)buf,&len2,start,x);
//printf("return:%d samples_out:%d bitstream_in:%d sample_sum:%d\n", y, len2, x, len); fflush(stdout);
	if(y<0){ mp_msg(MSGT_DECAUDIO,MSGL_V,"lavc_audio: error\n");break; }
	if(y<x) sh_audio->ds->buffer_pos+=y-x;  // put back data (HACK!)
	if(len2>0){
	  //len=len2;break;
	  if(len<0) len=len2; else len+=len2;
	  buf+=len2;
	}
        mp_dbg(MSGT_DECAUDIO,MSGL_DBG2,"Decoded %d -> %d  \n",y,len2);
    }
  return len;
}

#endif






See more files for this project here

The Open2x Project

The Open2x project exists to provide an open source resource for the GP2X handheld console based on the MagicEyes MMSP2 processing platform and MP2520F SoC. The project hosts Linux kernel source for the GP2X, boot loader (U-Boot) source and more.

Project homepage: http://www.distant-earth.com/open2x
Programming language(s): Assembly,C,C++
License: other

  native/
  Makefile
  TODO
  ad.c
  ad.h
  ad_acm.c
  ad_alaw.c
  ad_dk3adpcm.c
  ad_dmo.c
  ad_dshow.c
  ad_dvdpcm.c
  ad_faad.c
  ad_ffmpeg.c
  ad_hwac3.c
  ad_hwac3i.c
  ad_imaadpcm.c
  ad_internal.h
  ad_liba52.c
  ad_liba52i.c
  ad_libdv.c
  ad_libmad.c
  ad_libvorbis.c
  ad_mp3lib.c
  ad_msadpcm.c
  ad_msgsm.c
  ad_pcm.c
  ad_qtaudio.c
  ad_ra1428.c
  ad_realaud.c
  ad_sample.c
  ae_toolame.c
  ae_toolame.h
  cmmx.h
  dec_audio.c
  dec_audio.h
  dec_video.c
  dec_video.h
  img_format.c
  img_format.h
  mp_image.h
  mpc_info.h
  pullup.c
  pullup.h
  vd.c
  vd.h
  vd_divx4.c
  vd_dmo.c
  vd_dshow.c
  vd_ffmpeg.c
  vd_hmblck.c
  vd_ijpg.c
  vd_internal.h
  vd_libdv.c
  vd_libmpeg2.c
  vd_lzo.c
  vd_mpegpes.c
  vd_mpng.c
  vd_mtga.c
  vd_null.c
  vd_nuv.c
  vd_odivx.c
  vd_qtvideo.c
  vd_raw.c
  vd_realvid.c
  vd_sgi.c
  vd_theora.c
  vd_vfw.c
  vd_vfwex.c
  vd_xanim.c
  vd_xvid.c
  vd_xvid4.c
  vd_zrmjpeg.c
  ve.c
  ve_divx4.c
  ve_lavc.c
  ve_libdv.c
  ve_nuv.c
  ve_qtvideo.c
  ve_raw.c
  ve_vfw.c
  ve_x264.c
  ve_xvid.c
  ve_xvid4.c
  vf.c
  vf.h
  vf_1bpp.c
  vf_2xsai.c
  vf_bmovl.c
  vf_boxblur.c
  vf_crop.c
  vf_cropdetect.c
  vf_decimate.c
  vf_delogo.c
  vf_denoise3d.c
  vf_detc.c
  vf_dint.c
  vf_divtc.c
  vf_down3dright.c
  vf_dsize.c
  vf_dvbscale.c
  vf_eq.c