Mercurial > mplayer.hg
comparison libmpdemux/demux_mpc.c @ 16414:cdb7069d57b0
better bitrate calculation
author | reimar |
---|---|
date | Tue, 06 Sep 2005 20:35:14 +0000 |
parents | 719f5f7094c9 |
children | 5a4407e83a94 |
comparison
equal
deleted
inserted
replaced
16413:a07354861027 | 16414:cdb7069d57b0 |
---|---|
60 stream_read(s, &hdr[HDR_SIZE - 1], 1); | 60 stream_read(s, &hdr[HDR_SIZE - 1], 1); |
61 } | 61 } |
62 | 62 |
63 if (hdr[0] != 'M' || hdr[1] != 'P' || hdr[2] != '+') | 63 if (hdr[0] != 'M' || hdr[1] != 'P' || hdr[2] != '+') |
64 return 0; | 64 return 0; |
65 demuxer->movi_start = stream_tell(s) - HDR_SIZE; | |
66 demuxer->movi_end = s->end_pos; | |
65 demuxer->priv = malloc(HDR_SIZE); | 67 demuxer->priv = malloc(HDR_SIZE); |
66 memcpy(demuxer->priv, hdr, HDR_SIZE); | 68 memcpy(demuxer->priv, hdr, HDR_SIZE); |
67 return DEMUXER_TYPE_MPC; | 69 return DEMUXER_TYPE_MPC; |
68 } | 70 } |
69 | 71 |
76 | 78 |
77 { | 79 { |
78 char *wf = (char *)calloc(1, sizeof(WAVEFORMATEX) + HDR_SIZE); | 80 char *wf = (char *)calloc(1, sizeof(WAVEFORMATEX) + HDR_SIZE); |
79 char *header = &wf[sizeof(WAVEFORMATEX)]; | 81 char *header = &wf[sizeof(WAVEFORMATEX)]; |
80 const int freqs[4] = {44100, 48000, 37800, 32000}; | 82 const int freqs[4] = {44100, 48000, 37800, 32000}; |
83 int frames; | |
84 int seconds; | |
81 sh_audio->format = mmioFOURCC('M', 'P', 'C', ' '); | 85 sh_audio->format = mmioFOURCC('M', 'P', 'C', ' '); |
82 memcpy(header, priv, HDR_SIZE); | 86 memcpy(header, priv, HDR_SIZE); |
83 free(priv); | 87 free(priv); |
88 frames = header[4] | header[5] << 8 | header[6] << 16 | header[7] << 24; | |
84 sh_audio->wf = (WAVEFORMATEX *)wf; | 89 sh_audio->wf = (WAVEFORMATEX *)wf; |
85 sh_audio->wf->wFormatTag = sh_audio->format; | 90 sh_audio->wf->wFormatTag = sh_audio->format; |
86 sh_audio->wf->nChannels = 2; | 91 sh_audio->wf->nChannels = 2; |
87 sh_audio->wf->nSamplesPerSec = freqs[header[10] & 3]; | 92 sh_audio->wf->nSamplesPerSec = freqs[header[10] & 3]; |
88 sh_audio->wf->nBlockAlign = 32 * 36; | 93 sh_audio->wf->nBlockAlign = 32 * 36; |
89 sh_audio->wf->wBitsPerSample = 16; | 94 sh_audio->wf->wBitsPerSample = 16; |
90 sh_audio->wf->nAvgBytesPerSec = 128 * 1024; // dummy to make mencoder not hang | 95 seconds = 1152 * frames / sh_audio->wf->nSamplesPerSec; |
96 if (demuxer->movi_end > demuxer->movi_start && seconds > 0) | |
97 sh_audio->wf->nAvgBytesPerSec = (demuxer->movi_end - demuxer->movi_start) / seconds; | |
98 else | |
99 sh_audio->wf->nAvgBytesPerSec = 32 * 1024; // dummy to make mencoder not hang | |
91 sh_audio->wf->cbSize = HDR_SIZE; | 100 sh_audio->wf->cbSize = HDR_SIZE; |
92 demuxer->movi_start = stream_tell(s); | 101 demuxer->movi_start = stream_tell(s); |
93 demuxer->movi_end = s->end_pos; | 102 demuxer->movi_end = s->end_pos; |
94 } | 103 } |
95 | 104 |