comparison libmpdemux/demux_mpc.c @ 16612:e94616c973e3

Report total time
author reimar
date Tue, 27 Sep 2005 19:04:10 +0000
parents 5a4407e83a94
children ea5de6cb209b
comparison
equal deleted inserted replaced
16611:9574fb378080 16612:e94616c973e3
21 21
22 typedef struct da_priv { 22 typedef struct da_priv {
23 float last_pts; 23 float last_pts;
24 uint32_t dword; 24 uint32_t dword;
25 int pos; 25 int pos;
26 float length;
26 } da_priv_t; 27 } da_priv_t;
27 28
28 extern void free_sh_audio(sh_audio_t* sh); 29 extern void free_sh_audio(sh_audio_t* sh);
29 30
30 static uint32_t get_bits(da_priv_t* priv, stream_t* s, int bits) { 31 static uint32_t get_bits(da_priv_t* priv, stream_t* s, int bits) {
68 memcpy(demuxer->priv, hdr, HDR_SIZE); 69 memcpy(demuxer->priv, hdr, HDR_SIZE);
69 return DEMUXER_TYPE_MPC; 70 return DEMUXER_TYPE_MPC;
70 } 71 }
71 72
72 static demuxer_t *demux_mpc_open(demuxer_t* demuxer) { 73 static demuxer_t *demux_mpc_open(demuxer_t* demuxer) {
74 float seconds = 0;
73 stream_t *s = demuxer->stream; 75 stream_t *s = demuxer->stream;
74 sh_audio_t* sh_audio; 76 sh_audio_t* sh_audio;
75 da_priv_t* priv = demuxer->priv; 77 da_priv_t* priv = demuxer->priv;
76 78
77 sh_audio = new_sh_audio(demuxer,0); 79 sh_audio = new_sh_audio(demuxer,0);
79 { 81 {
80 char *wf = (char *)calloc(1, sizeof(WAVEFORMATEX) + HDR_SIZE); 82 char *wf = (char *)calloc(1, sizeof(WAVEFORMATEX) + HDR_SIZE);
81 char *header = &wf[sizeof(WAVEFORMATEX)]; 83 char *header = &wf[sizeof(WAVEFORMATEX)];
82 const int freqs[4] = {44100, 48000, 37800, 32000}; 84 const int freqs[4] = {44100, 48000, 37800, 32000};
83 int frames; 85 int frames;
84 int seconds;
85 sh_audio->format = mmioFOURCC('M', 'P', 'C', ' '); 86 sh_audio->format = mmioFOURCC('M', 'P', 'C', ' ');
86 memcpy(header, priv, HDR_SIZE); 87 memcpy(header, priv, HDR_SIZE);
87 free(priv); 88 free(priv);
88 frames = header[4] | header[5] << 8 | header[6] << 16 | header[7] << 24; 89 frames = header[4] | header[5] << 8 | header[6] << 16 | header[7] << 24;
89 sh_audio->wf = (WAVEFORMATEX *)wf; 90 sh_audio->wf = (WAVEFORMATEX *)wf;
90 sh_audio->wf->wFormatTag = sh_audio->format; 91 sh_audio->wf->wFormatTag = sh_audio->format;
91 sh_audio->wf->nChannels = 2; 92 sh_audio->wf->nChannels = 2;
92 sh_audio->wf->nSamplesPerSec = freqs[header[10] & 3]; 93 sh_audio->wf->nSamplesPerSec = freqs[header[10] & 3];
93 sh_audio->wf->nBlockAlign = 32 * 36; 94 sh_audio->wf->nBlockAlign = 32 * 36;
94 sh_audio->wf->wBitsPerSample = 16; 95 sh_audio->wf->wBitsPerSample = 16;
95 seconds = 1152 * frames / sh_audio->wf->nSamplesPerSec; 96 seconds = 1152 * frames / (float)sh_audio->wf->nSamplesPerSec;
96 if (demuxer->movi_end > demuxer->movi_start && seconds > 0) 97 if (demuxer->movi_end > demuxer->movi_start && seconds > 1)
97 sh_audio->wf->nAvgBytesPerSec = (demuxer->movi_end - demuxer->movi_start) / seconds; 98 sh_audio->wf->nAvgBytesPerSec = (demuxer->movi_end - demuxer->movi_start) / seconds;
98 else 99 else
99 sh_audio->wf->nAvgBytesPerSec = 32 * 1024; // dummy to make mencoder not hang 100 sh_audio->wf->nAvgBytesPerSec = 32 * 1024; // dummy to make mencoder not hang
100 sh_audio->wf->cbSize = HDR_SIZE; 101 sh_audio->wf->cbSize = HDR_SIZE;
101 demuxer->movi_start = stream_tell(s); 102 demuxer->movi_start = stream_tell(s);
102 demuxer->movi_end = s->end_pos; 103 demuxer->movi_end = s->end_pos;
103 } 104 }
104 105
105 priv = (da_priv_t *)malloc(sizeof(da_priv_t)); 106 priv = (da_priv_t *)malloc(sizeof(da_priv_t));
106 priv->last_pts = -1; 107 priv->last_pts = -1;
108 priv->length = seconds;
107 priv->dword = 0; 109 priv->dword = 0;
108 priv->pos = 0; 110 priv->pos = 0;
109 stream_read(s, (void *)&priv->dword, 4); 111 stream_read(s, (void *)&priv->dword, 4);
110 priv->pos = 8; 112 priv->pos = 8;
111 demuxer->priv = priv; 113 demuxer->priv = priv;
162 return; 164 return;
163 free(priv); 165 free(priv);
164 } 166 }
165 167
166 static int demux_mpc_control(demuxer_t *demuxer,int cmd, void *arg){ 168 static int demux_mpc_control(demuxer_t *demuxer,int cmd, void *arg){
169 da_priv_t* priv = demuxer->priv;
170 switch (cmd) {
171 case DEMUXER_CTRL_GET_TIME_LENGTH:
172 if (priv->length < 1) return DEMUXER_CTRL_DONTKNOW;
173 *((double *)arg) = priv->length;
174 return DEMUXER_CTRL_OK;
175 case DEMUXER_CTRL_GET_PERCENT_POS:
176 if (priv->length < 1) return DEMUXER_CTRL_DONTKNOW;
177 *((int *)arg) = priv->last_pts * 100 / priv->length;
178 return DEMUXER_CTRL_OK;
179 }
167 return DEMUXER_CTRL_NOTIMPL; 180 return DEMUXER_CTRL_NOTIMPL;
168 } 181 }
169 182
170 183
171 demuxer_desc_t demuxer_desc_mpc = { 184 demuxer_desc_t demuxer_desc_mpc = {