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