Mercurial > mplayer.hg
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 = { |