diff options
-rw-r--r-- | cfg-common.h | 23 | ||||
-rw-r--r-- | libmpdemux/demux_viv.c | 117 |
2 files changed, 108 insertions, 32 deletions
diff --git a/cfg-common.h b/cfg-common.h index 9e66277b34..0b574c2462 100644 --- a/cfg-common.h +++ b/cfg-common.h @@ -89,6 +89,7 @@ #else {"tv", "MPlayer was compiled without TV Interface support\n", CONF_TYPE_PRINT, 0, 0, 0}, #endif + {"vivo", vivoopts_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0}, #else @@ -114,4 +115,26 @@ struct config tvopts_conf[]={ }; #endif +/* VIVO demuxer options: */ +extern char *vivo_param_acodec; +extern int vivo_param_abitrate; +extern int vivo_param_samplerate; +extern int vivo_param_bytesperblock; +extern int vivo_param_width; +extern int vivo_param_height; +extern int vivo_param_vformat; + +struct config vivoopts_conf[]={ + /* audio options */ + {"acodec", &vivo_param_acodec, CONF_TYPE_STRING, 0, 0, 0}, + {"abitrate", &vivo_param_abitrate, CONF_TYPE_INT, 0, 0, 0}, + {"samplerate", &vivo_param_samplerate, CONF_TYPE_INT, 0, 0, 0}, + {"bytesperblock", &vivo_param_bytesperblock, CONF_TYPE_INT, 0, 0, 0}, + /* video options */ + {"width", &vivo_param_width, CONF_TYPE_INT, 0, 0, 0}, + {"height", &vivo_param_height, CONF_TYPE_INT, 0, 0, 0}, + {"vformat", &vivo_param_vformat, CONF_TYPE_INT, 0, 0, 0}, + {NULL, NULL, 0, 0, 0, 0} +}; + #endif diff --git a/libmpdemux/demux_viv.c b/libmpdemux/demux_viv.c index 180300fef3..4895724ba3 100644 --- a/libmpdemux/demux_viv.c +++ b/libmpdemux/demux_viv.c @@ -15,6 +15,15 @@ #include "stheader.h" #include "bswap.h" +/* parameters ! */ +char *vivo_param_acodec = NULL; +int vivo_param_abitrate = -1; +int vivo_param_samplerate = -1; +int vivo_param_bytesperblock = -1; +int vivo_param_width = -1; +int vivo_param_height = -1; +int vivo_param_vformat = -1; + /* VIVO audio standards from vivog723.acm: G.723: @@ -34,6 +43,8 @@ BitsPerSample = 8 */ +//enum { VIVO_AUDIO_G723, VIVO_AUDIO_SIREN }; + #define VIVO_AUDIO_G723 1 #define VIVO_AUDIO_SIREN 2 @@ -541,7 +552,6 @@ void demux_open_vivo(demuxer_t* demuxer){ /* viv1, viv2 (for better codecs.conf) */ sh->format = mmioFOURCC('v', 'i', 'v', priv->version); -// sh->format=0x6f766976; // "vivo" if(!sh->fps) { if (priv->fps) @@ -551,10 +561,23 @@ void demux_open_vivo(demuxer_t* demuxer){ } sh->frametime=1.0f/sh->fps; -#warning "FIXME! we can't scale" + /* XXX: FIXME: can't scale image. */ + /* hotfix to disable: */ priv->disp_width = priv->width; priv->disp_height = priv->height; + if (vivo_param_width != -1) + priv->disp_width = priv->width = vivo_param_width; + + if (vivo_param_height != -1) + priv->disp_height = priv->height = vivo_param_height; + + if (vivo_param_vformat != -1) + { + priv->disp_width = priv->width = h263_format[vivo_param_vformat][0]; + priv->disp_height = priv->height = h263_format[vivo_param_vformat][1]; + } + if (priv->disp_width) sh->disp_w = priv->disp_width; else @@ -580,9 +603,13 @@ void demux_open_vivo(demuxer_t* demuxer){ sh->bih->biBitCount=24; sh->bih->biCompression=sh->format; sh->bih->biSizeImage=sh->bih->biWidth*sh->bih->biHeight*3; - demuxer->video->sh=sh; sh->ds=demuxer->video; + + /* insert as stream */ + demuxer->video->sh=sh; + sh->ds=demuxer->video; demuxer->video->id=0; + /* disable seeking */ demuxer->seekable = 0; printf("VIVO Video stream %d size: display: %dx%d, codec: %lux%lu\n", @@ -590,12 +617,14 @@ void demux_open_vivo(demuxer_t* demuxer){ sh->bih->biHeight); } -if(demuxer->audio->id>=-1){ +/* AUDIO init */ +if (demuxer->audio->id >= -1){ if(!ds_fill_buffer(demuxer->audio)){ mp_msg(MSGT_DEMUX,MSGL_ERR,"VIVO: " MSGTR_MissingAudioStream); } else { sh_audio_t* sh=new_sh_audio(demuxer,1); + /* Select audio codec */ if (priv->audio_codec == 0) { if (priv->version == '2') @@ -603,59 +632,83 @@ if(demuxer->audio->id>=-1){ else priv->audio_codec = VIVO_AUDIO_G723; } + if (vivo_param_acodec != NULL) + { + if (!strcasecmp(vivo_param_acodec, "g723")) + priv->audio_codec = VIVO_AUDIO_G723; + if (!strcasecmp(vivo_param_acodec, "siren")) + priv->audio_codec = VIVO_AUDIO_SIREN; + } -// if (priv->version == '2') -// if (priv->audio_bytesperblock == 40) + sh->format = -1; + if (priv->audio_codec == VIVO_AUDIO_G723) + sh->format = 0x111; if (priv->audio_codec == VIVO_AUDIO_SIREN) - sh->format=0x112; /* Vivo Siren */ - else -// if (priv->version == '1') - sh->format=0x111; /* Vivo G.723 */ + sh->format = 0x112; + if (sh->format == -1) + { + mp_msg(MSGT_DEMUX, MSGL_ERR, "VIVO: Not support audio codec (%d)\n", + priv->audio_codec); + goto nosound; + } // Emulate WAVEFORMATEX struct: sh->wf=malloc(sizeof(WAVEFORMATEX)); memset(sh->wf,0,sizeof(WAVEFORMATEX)); sh->wf->wFormatTag=sh->format; - sh->wf->nChannels=1; - /* FIXME bits, samplerate, avgbytes, and blockalign */ + sh->wf->nChannels=1; /* 1 channels for both Siren and G.723 */ + + /* Set bits per sample */ if (priv->audio_codec == VIVO_AUDIO_SIREN) -// if (priv->audio_len == 40) - sh->wf->wBitsPerSample=16; /* siren */ + sh->wf->wBitsPerSample = 16; else - sh->wf->wBitsPerSample=8; - if (priv->audio_samplerate) - sh->wf->nSamplesPerSec=priv->audio_samplerate; + if (priv->audio_codec == VIVO_AUDIO_G723) + sh->wf->wBitsPerSample = 8; + + /* Set sampling rate */ + if (priv->audio_samplerate) /* got from header */ + sh->wf->nSamplesPerSec = priv->audio_samplerate; else { if (priv->audio_codec == VIVO_AUDIO_SIREN) - sh->wf->nSamplesPerSec=16000; - else - sh->wf->nSamplesPerSec=8000; + sh->wf->nSamplesPerSec = 16000; + if (priv->audio_codec == VIVO_AUDIO_G723) + sh->wf->nSamplesPerSec = 8000; } - if (priv->audio_bitrate) - sh->wf->nAvgBytesPerSec=priv->audio_bitrate; + if (vivo_param_samplerate != -1) + sh->wf->nSamplesPerSec = vivo_param_samplerate; + + /* Set audio bitrate */ + if (priv->audio_bitrate) /* got from header */ + sh->wf->nAvgBytesPerSec = priv->audio_bitrate; else { if (priv->audio_codec == VIVO_AUDIO_SIREN) -// if (priv->version == '2') sh->wf->nAvgBytesPerSec = 2000; - else + if (priv->audio_codec == VIVO_AUDIO_G723) sh->wf->nAvgBytesPerSec = 800; } -// sh->wf->nAvgBytesPerSec=sh->wf->nChannels*sh->wf->wBitsPerSample*sh->wf->nSamplesPerSec/8; -// sh->wf->nBlockAlign=2*sh->wf->nChannels; + if (vivo_param_abitrate != -1) + sh->wf->nAvgBytesPerSec = vivo_param_abitrate; + if (!priv->audio_bytesperblock) { if (priv->audio_codec == VIVO_AUDIO_SIREN) -// if (priv->version == '2') - sh->wf->nBlockAlign=40; /* siren */ - else - sh->wf->nBlockAlign=24; + sh->wf->nBlockAlign = 40; + if (priv->audio_codec == VIVO_AUDIO_G723) + sh->wf->nBlockAlign = 24; } else - sh->wf->nBlockAlign=priv->audio_bytesperblock; - demuxer->audio->sh=sh; sh->ds=demuxer->audio; + sh->wf->nBlockAlign = priv->audio_bytesperblock; + if (vivo_param_bytesperblock != -1) + sh->wf->nBlockAlign = vivo_param_bytesperblock; + +sound_ok: + /* insert as stream */ + demuxer->audio->sh=sh; + sh->ds=demuxer->audio; demuxer->audio->id=1; +nosound: } } |