view libmpcodecs/ad_msgsm.c @ 30086:f72ea7a67421

Introduce a sh_common struct that contains the parts in common by the audio, video and sub "stream headers". One reason for this is to help avoid/make more obvious things like members with the same function but different name (extradata vs. codecdata etc.), or members with the same name but different semantics (pts for audio vs. pts for video).
author reimar
date Sun, 27 Dec 2009 14:40:56 +0000
parents 0f1b5b68af32
children bbb6ebec87a0
line wrap: on
line source

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

#include "config.h"
#include "ad_internal.h"

static ad_info_t info =
{
	"native GSM/MSGSM audio decoder",
	"msgsm",
	"A'rpi",
	"XAnim",
	""
};

LIBAD_EXTERN(msgsm)

#include "native/xa_gsm.h"

static int init(sh_audio_t *sh_audio)
{
  if(!sh_audio->wf) return 0;
  // MS-GSM audio codec:
  GSM_Init();
  sh_audio->channels=sh_audio->wf->nChannels;
  sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
  sh_audio->samplesize=2;
  // decodes 65 byte -> 320 short
  // 1 sec: sh_audio->channels*sh_audio->samplerate  samples
  // 1 frame: 320 samples
  if(sh_audio->format==0x31 || sh_audio->format==0x32){
    sh_audio->ds->ss_mul=65; sh_audio->ds->ss_div=320;
  } else {
    sh_audio->ds->ss_mul=33; sh_audio->ds->ss_div=160;
  }
  sh_audio->i_bps=sh_audio->ds->ss_mul*(sh_audio->channels*sh_audio->samplerate)/sh_audio->ds->ss_div;  // 1:10
  return 1;
}

static int preinit(sh_audio_t *sh_audio)
{
  sh_audio->audio_out_minsize=4*320;
  return 1;
}

static void uninit(sh_audio_t *sh)
{
}

static int control(sh_audio_t *sh,int cmd,void* arg, ...)
{
  return CONTROL_UNKNOWN;
}

static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
{
  if(sh_audio->format==0x31 || sh_audio->format==0x32){
    unsigned char ibuf[65]; // 65 bytes / frame
    if(demux_read_data(sh_audio->ds,ibuf,65)!=65) return -1; // EOF
    XA_MSGSM_Decoder(ibuf,(unsigned short *) buf); // decodes 65 byte -> 320 short
    return 2*320;
  } else {
    unsigned char ibuf[33]; // 33 bytes / frame
    if(demux_read_data(sh_audio->ds,ibuf,33)!=33) return -1; // EOF
    XA_GSM_Decoder(ibuf,(unsigned short *) buf); // decodes 33 byte -> 160 short
    return 2*160;
  }
}