Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Side by Side Diff: webrtc/modules/media_file/media_file_utility.cc

Issue 1534193008: Misc. small cleanups (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Unnecessary parens Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 20 matching lines...) Expand all
31 { 31 {
32 int8_t ckID[4]; 32 int8_t ckID[4];
33 int32_t ckSize; 33 int32_t ckSize;
34 int8_t wave_ckID[4]; 34 int8_t wave_ckID[4];
35 }; 35 };
36 36
37 // First 8 byte of the format chunk. fmt_ckID should be "fmt ". fmt_ckSize is 37 // First 8 byte of the format chunk. fmt_ckID should be "fmt ". fmt_ckSize is
38 // the chunk size (16, 18 or 40 byte) 38 // the chunk size (16, 18 or 40 byte)
39 struct WAVE_CHUNK_header 39 struct WAVE_CHUNK_header
40 { 40 {
41 int8_t fmt_ckID[4]; 41 int8_t fmt_ckID[4];
42 int32_t fmt_ckSize; 42 uint32_t fmt_ckSize;
43 }; 43 };
44 } // unnamed namespace 44 } // unnamed namespace
45 45
46 namespace webrtc { 46 namespace webrtc {
47 ModuleFileUtility::ModuleFileUtility(const int32_t id) 47 ModuleFileUtility::ModuleFileUtility(const int32_t id)
48 : _wavFormatObj(), 48 : _wavFormatObj(),
49 _dataSize(0), 49 _dataSize(0),
50 _readSizeBytes(0), 50 _readSizeBytes(0),
51 _id(id), 51 _id(id),
52 _stopPointInMs(0), 52 _stopPointInMs(0),
(...skipping 19 matching lines...) Expand all
72 "ModuleFileUtility::~ModuleFileUtility()"); 72 "ModuleFileUtility::~ModuleFileUtility()");
73 } 73 }
74 74
75 int32_t ModuleFileUtility::ReadWavHeader(InStream& wav) 75 int32_t ModuleFileUtility::ReadWavHeader(InStream& wav)
76 { 76 {
77 WAVE_RIFF_header RIFFheaderObj; 77 WAVE_RIFF_header RIFFheaderObj;
78 WAVE_CHUNK_header CHUNKheaderObj; 78 WAVE_CHUNK_header CHUNKheaderObj;
79 // TODO (hellner): tmpStr and tmpStr2 seems unnecessary here. 79 // TODO (hellner): tmpStr and tmpStr2 seems unnecessary here.
80 char tmpStr[6] = "FOUR"; 80 char tmpStr[6] = "FOUR";
81 unsigned char tmpStr2[4]; 81 unsigned char tmpStr2[4];
82 int32_t i, len; 82 size_t i;
83 bool dataFound = false; 83 bool dataFound = false;
84 bool fmtFound = false; 84 bool fmtFound = false;
85 int8_t dummyRead; 85 int8_t dummyRead;
86 86
87 87
88 _dataSize = 0; 88 _dataSize = 0;
89 len = wav.Read(&RIFFheaderObj, sizeof(WAVE_RIFF_header)); 89 int len = wav.Read(&RIFFheaderObj, sizeof(WAVE_RIFF_header));
90 if(len != sizeof(WAVE_RIFF_header)) 90 if (len != static_cast<int>(sizeof(WAVE_RIFF_header)))
91 { 91 {
92 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 92 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
93 "Not a wave file (too short)"); 93 "Not a wave file (too short)");
94 return -1; 94 return -1;
95 } 95 }
96 96
97 for (i = 0; i < 4; i++) 97 for (i = 0; i < 4; i++)
98 { 98 {
99 tmpStr[i] = RIFFheaderObj.ckID[i]; 99 tmpStr[i] = RIFFheaderObj.ckID[i];
100 } 100 }
(...skipping 15 matching lines...) Expand all
116 } 116 }
117 117
118 len = wav.Read(&CHUNKheaderObj, sizeof(WAVE_CHUNK_header)); 118 len = wav.Read(&CHUNKheaderObj, sizeof(WAVE_CHUNK_header));
119 119
120 // WAVE files are stored in little endian byte order. Make sure that the 120 // WAVE files are stored in little endian byte order. Make sure that the
121 // data can be read on big endian as well. 121 // data can be read on big endian as well.
122 // TODO (hellner): little endian to system byte order should be done in 122 // TODO (hellner): little endian to system byte order should be done in
123 // in a subroutine. 123 // in a subroutine.
124 memcpy(tmpStr2, &CHUNKheaderObj.fmt_ckSize, 4); 124 memcpy(tmpStr2, &CHUNKheaderObj.fmt_ckSize, 4);
125 CHUNKheaderObj.fmt_ckSize = 125 CHUNKheaderObj.fmt_ckSize =
126 (int32_t) ((uint32_t) tmpStr2[0] + 126 (uint32_t)tmpStr2[0] + (((uint32_t)tmpStr2[1]) << 8) +
127 (((uint32_t)tmpStr2[1])<<8) + 127 (((uint32_t)tmpStr2[2]) << 16) + (((uint32_t)tmpStr2[3]) << 24);
128 (((uint32_t)tmpStr2[2])<<16) +
129 (((uint32_t)tmpStr2[3])<<24));
130 128
131 memcpy(tmpStr, CHUNKheaderObj.fmt_ckID, 4); 129 memcpy(tmpStr, CHUNKheaderObj.fmt_ckID, 4);
132 130
133 while ((len == sizeof(WAVE_CHUNK_header)) && (!fmtFound || !dataFound)) 131 while ((len == static_cast<int>(sizeof(WAVE_CHUNK_header))) &&
132 (!fmtFound || !dataFound))
134 { 133 {
135 if(strcmp(tmpStr, "fmt ") == 0) 134 if(strcmp(tmpStr, "fmt ") == 0)
136 { 135 {
137 len = wav.Read(&_wavFormatObj, sizeof(WAVE_FMTINFO_header)); 136 len = wav.Read(&_wavFormatObj, sizeof(WAVE_FMTINFO_header));
138 137
139 memcpy(tmpStr2, &_wavFormatObj.formatTag, 2); 138 memcpy(tmpStr2, &_wavFormatObj.formatTag, 2);
140 _wavFormatObj.formatTag = 139 _wavFormatObj.formatTag =
141 (uint32_t)tmpStr2[0] + (((uint32_t)tmpStr2[1])<<8); 140 (uint32_t)tmpStr2[0] + (((uint32_t)tmpStr2[1])<<8);
142 memcpy(tmpStr2, &_wavFormatObj.nChannels, 2); 141 memcpy(tmpStr2, &_wavFormatObj.nChannels, 2);
143 _wavFormatObj.nChannels = 142 _wavFormatObj.nChannels =
(...skipping 13 matching lines...) Expand all
157 (((uint32_t)tmpStr2[3])<<24)); 156 (((uint32_t)tmpStr2[3])<<24));
158 memcpy(tmpStr2, &_wavFormatObj.nBlockAlign, 2); 157 memcpy(tmpStr2, &_wavFormatObj.nBlockAlign, 2);
159 _wavFormatObj.nBlockAlign = 158 _wavFormatObj.nBlockAlign =
160 (int16_t) ((uint32_t)tmpStr2[0] + 159 (int16_t) ((uint32_t)tmpStr2[0] +
161 (((uint32_t)tmpStr2[1])<<8)); 160 (((uint32_t)tmpStr2[1])<<8));
162 memcpy(tmpStr2, &_wavFormatObj.nBitsPerSample, 2); 161 memcpy(tmpStr2, &_wavFormatObj.nBitsPerSample, 2);
163 _wavFormatObj.nBitsPerSample = 162 _wavFormatObj.nBitsPerSample =
164 (int16_t) ((uint32_t)tmpStr2[0] + 163 (int16_t) ((uint32_t)tmpStr2[0] +
165 (((uint32_t)tmpStr2[1])<<8)); 164 (((uint32_t)tmpStr2[1])<<8));
166 165
166 if (CHUNKheaderObj.fmt_ckSize < sizeof(WAVE_FMTINFO_header))
167 {
168 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
169 "Chunk size is too small");
170 return -1;
171 }
167 for (i = 0; 172 for (i = 0;
168 i < (CHUNKheaderObj.fmt_ckSize - 173 i < CHUNKheaderObj.fmt_ckSize - sizeof(WAVE_FMTINFO_header);
169 (int32_t)sizeof(WAVE_FMTINFO_header));
170 i++) 174 i++)
171 { 175 {
172 len = wav.Read(&dummyRead, 1); 176 len = wav.Read(&dummyRead, 1);
173 if(len != 1) 177 if(len != 1)
174 { 178 {
175 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 179 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
176 "File corrupted, reached EOF (reading fmt)"); 180 "File corrupted, reached EOF (reading fmt)");
177 return -1; 181 return -1;
178 } 182 }
179 } 183 }
180 fmtFound = true; 184 fmtFound = true;
181 } 185 }
182 else if(strcmp(tmpStr, "data") == 0) 186 else if(strcmp(tmpStr, "data") == 0)
183 { 187 {
184 _dataSize = CHUNKheaderObj.fmt_ckSize; 188 _dataSize = CHUNKheaderObj.fmt_ckSize;
185 dataFound = true; 189 dataFound = true;
186 break; 190 break;
187 } 191 }
188 else 192 else
189 { 193 {
190 for (i = 0; i < (CHUNKheaderObj.fmt_ckSize); i++) 194 for (i = 0; i < CHUNKheaderObj.fmt_ckSize; i++)
191 { 195 {
192 len = wav.Read(&dummyRead, 1); 196 len = wav.Read(&dummyRead, 1);
193 if(len != 1) 197 if(len != 1)
194 { 198 {
195 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 199 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
196 "File corrupted, reached EOF (reading other)"); 200 "File corrupted, reached EOF (reading other)");
197 return -1; 201 return -1;
198 } 202 }
199 } 203 }
200 } 204 }
201 205
202 len = wav.Read(&CHUNKheaderObj, sizeof(WAVE_CHUNK_header)); 206 len = wav.Read(&CHUNKheaderObj, sizeof(WAVE_CHUNK_header));
203 207
204 memcpy(tmpStr2, &CHUNKheaderObj.fmt_ckSize, 4); 208 memcpy(tmpStr2, &CHUNKheaderObj.fmt_ckSize, 4);
205 CHUNKheaderObj.fmt_ckSize = 209 CHUNKheaderObj.fmt_ckSize =
206 (int32_t) ((uint32_t)tmpStr2[0] + 210 (uint32_t)tmpStr2[0] + (((uint32_t)tmpStr2[1]) << 8) +
207 (((uint32_t)tmpStr2[1])<<8) + 211 (((uint32_t)tmpStr2[2]) << 16) + (((uint32_t)tmpStr2[3]) << 24);
208 (((uint32_t)tmpStr2[2])<<16) +
209 (((uint32_t)tmpStr2[3])<<24));
210 212
211 memcpy(tmpStr, CHUNKheaderObj.fmt_ckID, 4); 213 memcpy(tmpStr, CHUNKheaderObj.fmt_ckID, 4);
212 } 214 }
213 215
214 // Either a proper format chunk has been read or a data chunk was come 216 // Either a proper format chunk has been read or a data chunk was come
215 // across. 217 // across.
216 if( (_wavFormatObj.formatTag != kWavFormatPcm) && 218 if( (_wavFormatObj.formatTag != kWavFormatPcm) &&
217 (_wavFormatObj.formatTag != kWavFormatALaw) && 219 (_wavFormatObj.formatTag != kWavFormatALaw) &&
218 (_wavFormatObj.formatTag != kWavFormatMuLaw)) 220 (_wavFormatObj.formatTag != kWavFormatMuLaw))
219 { 221 {
(...skipping 14 matching lines...) Expand all
234 if((_wavFormatObj.nBitsPerSample != 8) && 236 if((_wavFormatObj.nBitsPerSample != 8) &&
235 (_wavFormatObj.nBitsPerSample != 16)) 237 (_wavFormatObj.nBitsPerSample != 16))
236 { 238 {
237 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 239 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
238 "nBitsPerSample value=%d not supported!", 240 "nBitsPerSample value=%d not supported!",
239 _wavFormatObj.nBitsPerSample); 241 _wavFormatObj.nBitsPerSample);
240 return -1; 242 return -1;
241 } 243 }
242 244
243 // Calculate the number of bytes that 10 ms of audio data correspond to. 245 // Calculate the number of bytes that 10 ms of audio data correspond to.
244 if(_wavFormatObj.formatTag == kWavFormatPcm) 246 size_t samples_per_10ms =
245 { 247 ((_wavFormatObj.formatTag == kWavFormatPcm) &&
246 // TODO (hellner): integer division for 22050 and 11025 would yield 248 (_wavFormatObj.nSamplesPerSec == 44100)) ?
247 // the same result as the else statement. Remove those 249 440 : static_cast<size_t>(_wavFormatObj.nSamplesPerSec / 100);
248 // special cases? 250 _readSizeBytes = samples_per_10ms * _wavFormatObj.nChannels *
249 if(_wavFormatObj.nSamplesPerSec == 44100) 251 (_wavFormatObj.nBitsPerSample / 8);
250 {
251 _readSizeBytes = 440 * _wavFormatObj.nChannels *
252 (_wavFormatObj.nBitsPerSample / 8);
253 } else if(_wavFormatObj.nSamplesPerSec == 22050) {
254 _readSizeBytes = 220 * _wavFormatObj.nChannels *
255 (_wavFormatObj.nBitsPerSample / 8);
256 } else if(_wavFormatObj.nSamplesPerSec == 11025) {
257 _readSizeBytes = 110 * _wavFormatObj.nChannels *
258 (_wavFormatObj.nBitsPerSample / 8);
259 } else {
260 _readSizeBytes = (_wavFormatObj.nSamplesPerSec/100) *
261 _wavFormatObj.nChannels * (_wavFormatObj.nBitsPerSample / 8);
262 }
263
264 } else {
265 _readSizeBytes = (_wavFormatObj.nSamplesPerSec/100) *
266 _wavFormatObj.nChannels * (_wavFormatObj.nBitsPerSample / 8);
267 }
268 return 0; 252 return 0;
269 } 253 }
270 254
271 int32_t ModuleFileUtility::InitWavCodec(uint32_t samplesPerSec, 255 int32_t ModuleFileUtility::InitWavCodec(uint32_t samplesPerSec,
272 uint32_t channels, 256 uint32_t channels,
273 uint32_t bitsPerSample, 257 uint32_t bitsPerSample,
274 uint32_t formatTag) 258 uint32_t formatTag)
275 { 259 {
276 codec_info_.pltype = -1; 260 codec_info_.pltype = -1;
277 codec_info_.plfreq = samplesPerSec; 261 codec_info_.plfreq = samplesPerSec;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 "failed to read WAV header!"); 353 "failed to read WAV header!");
370 return -1; 354 return -1;
371 } 355 }
372 356
373 _playoutPositionMs = 0; 357 _playoutPositionMs = 0;
374 _readPos = 0; 358 _readPos = 0;
375 359
376 if(start > 0) 360 if(start > 0)
377 { 361 {
378 uint8_t dummy[WAV_MAX_BUFFER_SIZE]; 362 uint8_t dummy[WAV_MAX_BUFFER_SIZE];
379 int32_t readLength; 363 int readLength;
380 if(_readSizeBytes <= WAV_MAX_BUFFER_SIZE) 364 if(_readSizeBytes <= WAV_MAX_BUFFER_SIZE)
381 { 365 {
382 while (_playoutPositionMs < start) 366 while (_playoutPositionMs < start)
383 { 367 {
384 readLength = wav.Read(dummy, _readSizeBytes); 368 readLength = wav.Read(dummy, _readSizeBytes);
385 if(readLength == _readSizeBytes) 369 if(readLength == static_cast<int>(_readSizeBytes))
386 { 370 {
387 _readPos += readLength; 371 _readPos += _readSizeBytes;
388 _playoutPositionMs += 10; 372 _playoutPositionMs += 10;
389 } 373 }
390 else // Must have reached EOF before start position! 374 else // Must have reached EOF before start position!
391 { 375 {
392 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 376 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
393 "InitWavReading(), EOF before start position"); 377 "InitWavReading(), EOF before start position");
394 return -1; 378 return -1;
395 } 379 }
396 } 380 }
397 } 381 }
398 else 382 else
399 { 383 {
400 return -1; 384 return -1;
401 } 385 }
402 } 386 }
403 if( InitWavCodec(_wavFormatObj.nSamplesPerSec, _wavFormatObj.nChannels, 387 if( InitWavCodec(_wavFormatObj.nSamplesPerSec, _wavFormatObj.nChannels,
404 _wavFormatObj.nBitsPerSample, 388 _wavFormatObj.nBitsPerSample,
405 _wavFormatObj.formatTag) != 0) 389 _wavFormatObj.formatTag) != 0)
406 { 390 {
407 return -1; 391 return -1;
408 } 392 }
409 _bytesPerSample = _wavFormatObj.nBitsPerSample / 8; 393 _bytesPerSample = static_cast<size_t>(_wavFormatObj.nBitsPerSample / 8);
410 394
411 395
412 _startPointInMs = start; 396 _startPointInMs = start;
413 _stopPointInMs = stop; 397 _stopPointInMs = stop;
414 _reading = true; 398 _reading = true;
415 return 0; 399 return 0;
416 } 400 }
417 401
418 int32_t ModuleFileUtility::ReadWavDataAsMono( 402 int32_t ModuleFileUtility::ReadWavDataAsMono(
419 InStream& wav, 403 InStream& wav,
420 int8_t* outData, 404 int8_t* outData,
421 const size_t bufferSize) 405 const size_t bufferSize)
422 { 406 {
423 WEBRTC_TRACE( 407 WEBRTC_TRACE(
424 kTraceStream, 408 kTraceStream,
425 kTraceFile, 409 kTraceFile,
426 _id, 410 _id,
427 "ModuleFileUtility::ReadWavDataAsMono(wav= 0x%x, outData= 0x%d, " 411 "ModuleFileUtility::ReadWavDataAsMono(wav= 0x%x, outData= 0x%d, "
428 "bufSize= %" PRIuS ")", 412 "bufSize= %" PRIuS ")",
429 &wav, 413 &wav,
430 outData, 414 outData,
431 bufferSize); 415 bufferSize);
432 416
433 // The number of bytes that should be read from file. 417 // The number of bytes that should be read from file.
434 const uint32_t totalBytesNeeded = _readSizeBytes; 418 const size_t totalBytesNeeded = _readSizeBytes;
435 // The number of bytes that will be written to outData. 419 // The number of bytes that will be written to outData.
436 const uint32_t bytesRequested = (codec_info_.channels == 2) ? 420 const size_t bytesRequested = (codec_info_.channels == 2) ?
437 totalBytesNeeded >> 1 : totalBytesNeeded; 421 totalBytesNeeded >> 1 : totalBytesNeeded;
438 if(bufferSize < bytesRequested) 422 if(bufferSize < bytesRequested)
439 { 423 {
440 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 424 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
441 "ReadWavDataAsMono: output buffer is too short!"); 425 "ReadWavDataAsMono: output buffer is too short!");
442 return -1; 426 return -1;
443 } 427 }
444 if(outData == NULL) 428 if(outData == NULL)
445 { 429 {
446 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 430 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
(...skipping 18 matching lines...) Expand all
465 } 449 }
466 if(bytesRead < 0) 450 if(bytesRead < 0)
467 { 451 {
468 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 452 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
469 "ReadWavDataAsMono: failed to read data from WAV file."); 453 "ReadWavDataAsMono: failed to read data from WAV file.");
470 return -1; 454 return -1;
471 } 455 }
472 // Output data is should be mono. 456 // Output data is should be mono.
473 if(codec_info_.channels == 2) 457 if(codec_info_.channels == 2)
474 { 458 {
475 for (uint32_t i = 0; i < bytesRequested / _bytesPerSample; i++) 459 for (size_t i = 0; i < bytesRequested / _bytesPerSample; i++)
476 { 460 {
477 // Sample value is the average of left and right buffer rounded to 461 // Sample value is the average of left and right buffer rounded to
478 // closest integer value. Note samples can be either 1 or 2 byte. 462 // closest integer value. Note samples can be either 1 or 2 byte.
479 if(_bytesPerSample == 1) 463 if(_bytesPerSample == 1)
480 { 464 {
481 _tempData[i] = ((_tempData[2 * i] + _tempData[(2 * i) + 1] + 465 _tempData[i] = ((_tempData[2 * i] + _tempData[(2 * i) + 1] +
482 1) >> 1); 466 1) >> 1);
483 } 467 }
484 else 468 else
485 { 469 {
486 int16_t* sampleData = (int16_t*) _tempData; 470 int16_t* sampleData = (int16_t*) _tempData;
487 sampleData[i] = ((sampleData[2 * i] + sampleData[(2 * i) + 1] + 471 sampleData[i] = ((sampleData[2 * i] + sampleData[(2 * i) + 1] +
488 1) >> 1); 472 1) >> 1);
489 } 473 }
490 } 474 }
491 memcpy(outData, _tempData, bytesRequested); 475 memcpy(outData, _tempData, bytesRequested);
492 } 476 }
493 return bytesRequested; 477 return static_cast<int32_t>(bytesRequested);
494 } 478 }
495 479
496 int32_t ModuleFileUtility::ReadWavDataAsStereo( 480 int32_t ModuleFileUtility::ReadWavDataAsStereo(
497 InStream& wav, 481 InStream& wav,
498 int8_t* outDataLeft, 482 int8_t* outDataLeft,
499 int8_t* outDataRight, 483 int8_t* outDataRight,
500 const size_t bufferSize) 484 const size_t bufferSize)
501 { 485 {
502 WEBRTC_TRACE( 486 WEBRTC_TRACE(
503 kTraceStream, 487 kTraceStream,
(...skipping 23 matching lines...) Expand all
527 return -1; 511 return -1;
528 } 512 }
529 if(! _reading) 513 if(! _reading)
530 { 514 {
531 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 515 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
532 "ReadWavDataAsStereo: no longer reading file."); 516 "ReadWavDataAsStereo: no longer reading file.");
533 return -1; 517 return -1;
534 } 518 }
535 519
536 // The number of bytes that should be read from file. 520 // The number of bytes that should be read from file.
537 const uint32_t totalBytesNeeded = _readSizeBytes; 521 const size_t totalBytesNeeded = _readSizeBytes;
538 // The number of bytes that will be written to the left and the right 522 // The number of bytes that will be written to the left and the right
539 // buffers. 523 // buffers.
540 const uint32_t bytesRequested = totalBytesNeeded >> 1; 524 const size_t bytesRequested = totalBytesNeeded >> 1;
541 if(bufferSize < bytesRequested) 525 if(bufferSize < bytesRequested)
542 { 526 {
543 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 527 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
544 "ReadWavData: Output buffers are too short!"); 528 "ReadWavData: Output buffers are too short!");
545 assert(false); 529 assert(false);
546 return -1; 530 return -1;
547 } 531 }
548 532
549 int32_t bytesRead = ReadWavData(wav, _tempData, totalBytesNeeded); 533 int32_t bytesRead = ReadWavData(wav, _tempData, totalBytesNeeded);
550 if(bytesRead <= 0) 534 if(bytesRead <= 0)
551 { 535 {
552 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 536 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
553 "ReadWavDataAsStereo: failed to read data from WAV file."); 537 "ReadWavDataAsStereo: failed to read data from WAV file.");
554 return -1; 538 return -1;
555 } 539 }
556 540
557 // Turn interleaved audio to left and right buffer. Note samples can be 541 // Turn interleaved audio to left and right buffer. Note samples can be
558 // either 1 or 2 bytes 542 // either 1 or 2 bytes
559 if(_bytesPerSample == 1) 543 if(_bytesPerSample == 1)
560 { 544 {
561 for (uint32_t i = 0; i < bytesRequested; i++) 545 for (size_t i = 0; i < bytesRequested; i++)
562 { 546 {
563 outDataLeft[i] = _tempData[2 * i]; 547 outDataLeft[i] = _tempData[2 * i];
564 outDataRight[i] = _tempData[(2 * i) + 1]; 548 outDataRight[i] = _tempData[(2 * i) + 1];
565 } 549 }
566 } 550 }
567 else if(_bytesPerSample == 2) 551 else if(_bytesPerSample == 2)
568 { 552 {
569 int16_t* sampleData = reinterpret_cast<int16_t*>(_tempData); 553 int16_t* sampleData = reinterpret_cast<int16_t*>(_tempData);
570 int16_t* outLeft = reinterpret_cast<int16_t*>(outDataLeft); 554 int16_t* outLeft = reinterpret_cast<int16_t*>(outDataLeft);
571 int16_t* outRight = reinterpret_cast<int16_t*>( 555 int16_t* outRight = reinterpret_cast<int16_t*>(
572 outDataRight); 556 outDataRight);
573 557
574 // Bytes requested to samples requested. 558 // Bytes requested to samples requested.
575 uint32_t sampleCount = bytesRequested >> 1; 559 size_t sampleCount = bytesRequested >> 1;
576 for (uint32_t i = 0; i < sampleCount; i++) 560 for (size_t i = 0; i < sampleCount; i++)
577 { 561 {
578 outLeft[i] = sampleData[2 * i]; 562 outLeft[i] = sampleData[2 * i];
579 outRight[i] = sampleData[(2 * i) + 1]; 563 outRight[i] = sampleData[(2 * i) + 1];
580 } 564 }
581 } else { 565 } else {
582 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 566 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
583 "ReadWavStereoData: unsupported sample size %d!", 567 "ReadWavStereoData: unsupported sample size %" PRIuS "!",
584 _bytesPerSample); 568 _bytesPerSample);
585 assert(false); 569 assert(false);
586 return -1; 570 return -1;
587 } 571 }
588 return bytesRequested; 572 return static_cast<int32_t>(bytesRequested);
589 } 573 }
590 574
591 int32_t ModuleFileUtility::ReadWavData( 575 int32_t ModuleFileUtility::ReadWavData(InStream& wav,
592 InStream& wav, 576 uint8_t* buffer,
593 uint8_t* buffer, 577 size_t dataLengthInBytes)
594 const uint32_t dataLengthInBytes)
595 { 578 {
596 WEBRTC_TRACE( 579 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
597 kTraceStream, 580 "ModuleFileUtility::ReadWavData(wav= 0x%x, buffer= 0x%x, "
598 kTraceFile, 581 "dataLen= %" PRIuS ")", &wav, buffer, dataLengthInBytes);
599 _id,
600 "ModuleFileUtility::ReadWavData(wav= 0x%x, buffer= 0x%x, dataLen= %ld)",
601 &wav,
602 buffer,
603 dataLengthInBytes);
604 582
605 583
606 if(buffer == NULL) 584 if(buffer == NULL)
607 { 585 {
608 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 586 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
609 "ReadWavDataAsMono: output buffer NULL!"); 587 "ReadWavDataAsMono: output buffer NULL!");
610 return -1; 588 return -1;
611 } 589 }
612 590
613 // Make sure that a read won't return too few samples. 591 // Make sure that a read won't return too few samples.
614 // TODO (hellner): why not read the remaining bytes needed from the start 592 // TODO (hellner): why not read the remaining bytes needed from the start
615 // of the file? 593 // of the file?
616 if((_dataSize - _readPos) < (int32_t)dataLengthInBytes) 594 if(_dataSize < (_readPos + dataLengthInBytes))
617 { 595 {
618 // Rewind() being -1 may be due to the file not supposed to be looped. 596 // Rewind() being -1 may be due to the file not supposed to be looped.
619 if(wav.Rewind() == -1) 597 if(wav.Rewind() == -1)
620 { 598 {
621 _reading = false; 599 _reading = false;
622 return 0; 600 return 0;
623 } 601 }
624 if(InitWavReading(wav, _startPointInMs, _stopPointInMs) == -1) 602 if(InitWavReading(wav, _startPointInMs, _stopPointInMs) == -1)
625 { 603 {
626 _reading = false; 604 _reading = false;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 1 : codecInst.channels; 667 1 : codecInst.channels;
690 668
691 if(STR_CASE_CMP(codecInst.plname, "PCMU") == 0) 669 if(STR_CASE_CMP(codecInst.plname, "PCMU") == 0)
692 { 670 {
693 _bytesPerSample = 1; 671 _bytesPerSample = 1;
694 if(WriteWavHeader(wav, 8000, _bytesPerSample, channels, 672 if(WriteWavHeader(wav, 8000, _bytesPerSample, channels,
695 kWavFormatMuLaw, 0) == -1) 673 kWavFormatMuLaw, 0) == -1)
696 { 674 {
697 return -1; 675 return -1;
698 } 676 }
699 }else if(STR_CASE_CMP(codecInst.plname, "PCMA") == 0) 677 }
678 else if(STR_CASE_CMP(codecInst.plname, "PCMA") == 0)
700 { 679 {
701 _bytesPerSample = 1; 680 _bytesPerSample = 1;
702 if(WriteWavHeader(wav, 8000, _bytesPerSample, channels, kWavFormatALaw, 681 if(WriteWavHeader(wav, 8000, _bytesPerSample, channels, kWavFormatALaw,
703 0) == -1) 682 0) == -1)
704 { 683 {
705 return -1; 684 return -1;
706 } 685 }
707 } 686 }
708 else if(STR_CASE_CMP(codecInst.plname, "L16") == 0) 687 else if(STR_CASE_CMP(codecInst.plname, "L16") == 0)
709 { 688 {
(...skipping 12 matching lines...) Expand all
722 } 701 }
723 _writing = true; 702 _writing = true;
724 _bytesWritten = 0; 703 _bytesWritten = 0;
725 return 0; 704 return 0;
726 } 705 }
727 706
728 int32_t ModuleFileUtility::WriteWavData(OutStream& out, 707 int32_t ModuleFileUtility::WriteWavData(OutStream& out,
729 const int8_t* buffer, 708 const int8_t* buffer,
730 const size_t dataLength) 709 const size_t dataLength)
731 { 710 {
732 WEBRTC_TRACE( 711 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
733 kTraceStream, 712 "ModuleFileUtility::WriteWavData(out= 0x%x, buf= 0x%x, "
734 kTraceFile, 713 "dataLen= %" PRIuS ")", &out, buffer, dataLength);
735 _id,
736 "ModuleFileUtility::WriteWavData(out= 0x%x, buf= 0x%x, dataLen= %" PRIuS
737 ")",
738 &out,
739 buffer,
740 dataLength);
741 714
742 if(buffer == NULL) 715 if(buffer == NULL)
743 { 716 {
744 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 717 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
745 "WriteWavData: input buffer NULL!"); 718 "WriteWavData: input buffer NULL!");
746 return -1; 719 return -1;
747 } 720 }
748 721
749 if(!out.Write(buffer, dataLength)) 722 if(!out.Write(buffer, dataLength))
750 { 723 {
751 return -1; 724 return -1;
752 } 725 }
753 _bytesWritten += dataLength; 726 _bytesWritten += dataLength;
754 return static_cast<int32_t>(dataLength); 727 return static_cast<int32_t>(dataLength);
755 } 728 }
756 729
757 730
758 int32_t ModuleFileUtility::WriteWavHeader( 731 int32_t ModuleFileUtility::WriteWavHeader(
759 OutStream& wav, 732 OutStream& wav,
760 const uint32_t freq, 733 uint32_t freq,
761 const uint32_t bytesPerSample, 734 size_t bytesPerSample,
762 const uint32_t channels, 735 uint32_t channels,
763 const uint32_t format, 736 uint32_t format,
764 const uint32_t lengthInBytes) 737 size_t lengthInBytes)
765 { 738 {
766 // Frame size in bytes for 10 ms of audio. 739 // Frame size in bytes for 10 ms of audio.
767 // TODO (hellner): 44.1 kHz has 440 samples frame size. Doesn't seem to 740 // TODO (hellner): 44.1 kHz has 440 samples frame size. Doesn't seem to
768 // be taken into consideration here! 741 // be taken into consideration here!
769 const int32_t frameSize = (freq / 100) * channels; 742 const size_t frameSize = (freq / 100) * channels;
770 743
771 // Calculate the number of full frames that the wave file contain. 744 // Calculate the number of full frames that the wave file contain.
772 const int32_t dataLengthInBytes = frameSize * (lengthInBytes / frameSize); 745 const size_t dataLengthInBytes = frameSize * (lengthInBytes / frameSize);
773 746
774 uint8_t buf[kWavHeaderSize]; 747 uint8_t buf[kWavHeaderSize];
775 webrtc::WriteWavHeader(buf, channels, freq, static_cast<WavFormat>(format), 748 webrtc::WriteWavHeader(buf, channels, freq, static_cast<WavFormat>(format),
776 bytesPerSample, dataLengthInBytes / bytesPerSample); 749 bytesPerSample, dataLengthInBytes / bytesPerSample);
777 wav.Write(buf, kWavHeaderSize); 750 wav.Write(buf, kWavHeaderSize);
778 return 0; 751 return 0;
779 } 752 }
780 753
781 int32_t ModuleFileUtility::UpdateWavHeader(OutStream& wav) 754 int32_t ModuleFileUtility::UpdateWavHeader(OutStream& wav)
782 { 755 {
783 int32_t res = -1; 756 int32_t res = -1;
784 if(wav.Rewind() == -1) 757 if(wav.Rewind() == -1)
785 { 758 {
786 return -1; 759 return -1;
787 } 760 }
788 uint32_t channels = (codec_info_.channels == 0) ? 761 uint32_t channels = (codec_info_.channels == 0) ? 1 : codec_info_.channels;
789 1 : codec_info_.channels;
790 762
791 if(STR_CASE_CMP(codec_info_.plname, "L16") == 0) 763 if(STR_CASE_CMP(codec_info_.plname, "L16") == 0)
792 { 764 {
793 res = WriteWavHeader(wav, codec_info_.plfreq, 2, channels, 765 res = WriteWavHeader(wav, codec_info_.plfreq, 2, channels,
794 kWavFormatPcm, _bytesWritten); 766 kWavFormatPcm, _bytesWritten);
795 } else if(STR_CASE_CMP(codec_info_.plname, "PCMU") == 0) { 767 } else if(STR_CASE_CMP(codec_info_.plname, "PCMU") == 0) {
796 res = WriteWavHeader(wav, 8000, 1, channels, kWavFormatMuLaw, 768 res = WriteWavHeader(wav, 8000, 1, channels, kWavFormatMuLaw,
797 _bytesWritten); 769 _bytesWritten);
798 } else if(STR_CASE_CMP(codec_info_.plname, "PCMA") == 0) { 770 } else if(STR_CASE_CMP(codec_info_.plname, "PCMA") == 0) {
799 res = WriteWavHeader(wav, 8000, 1, channels, kWavFormatALaw, 771 res = WriteWavHeader(wav, 8000, 1, channels, kWavFormatALaw,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 memcpy(&codec_info_,&cinst,sizeof(CodecInst)); 804 memcpy(&codec_info_,&cinst,sizeof(CodecInst));
833 _reading = true; 805 _reading = true;
834 return 0; 806 return 0;
835 } 807 }
836 808
837 int32_t ModuleFileUtility::ReadPreEncodedData( 809 int32_t ModuleFileUtility::ReadPreEncodedData(
838 InStream& in, 810 InStream& in,
839 int8_t* outData, 811 int8_t* outData,
840 const size_t bufferSize) 812 const size_t bufferSize)
841 { 813 {
842 WEBRTC_TRACE( 814 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
843 kTraceStream, 815 "ModuleFileUtility::ReadPreEncodedData(in= 0x%x, "
844 kTraceFile, 816 "outData= 0x%x, bufferSize= %" PRIuS ")", &in, outData,
845 _id, 817 bufferSize);
846 "ModuleFileUtility::ReadPreEncodedData(in= 0x%x, outData= 0x%x, "
847 "bufferSize= %" PRIuS ")",
848 &in,
849 outData,
850 bufferSize);
851 818
852 if(outData == NULL) 819 if(outData == NULL)
853 { 820 {
854 WEBRTC_TRACE(kTraceError, kTraceFile, _id, "output buffer NULL"); 821 WEBRTC_TRACE(kTraceError, kTraceFile, _id, "output buffer NULL");
855 } 822 }
856 823
857 uint32_t frameLen; 824 size_t frameLen;
858 uint8_t buf[64]; 825 uint8_t buf[64];
859 // Each frame has a two byte header containing the frame length. 826 // Each frame has a two byte header containing the frame length.
860 int32_t res = in.Read(buf, 2); 827 int32_t res = in.Read(buf, 2);
861 if(res != 2) 828 if(res != 2)
862 { 829 {
863 if(!in.Rewind()) 830 if(!in.Rewind())
864 { 831 {
865 // The first byte is the codec identifier. 832 // The first byte is the codec identifier.
866 in.Read(buf, 1); 833 in.Read(buf, 1);
867 res = in.Read(buf, 2); 834 res = in.Read(buf, 2);
868 } 835 }
869 else 836 else
870 { 837 {
871 return -1; 838 return -1;
872 } 839 }
873 } 840 }
874 frameLen = buf[0] + buf[1] * 256; 841 frameLen = buf[0] + buf[1] * 256;
875 if(bufferSize < frameLen) 842 if(bufferSize < frameLen)
876 { 843 {
877 WEBRTC_TRACE( 844 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
878 kTraceError, 845 "buffer not large enough to read %" PRIuS " bytes of "
879 kTraceFile, 846 "pre-encoded data!", frameLen);
880 _id,
881 "buffer not large enough to read %d bytes of pre-encoded data!",
882 frameLen);
883 return -1; 847 return -1;
884 } 848 }
885 return in.Read(outData, frameLen); 849 return in.Read(outData, frameLen);
886 } 850 }
887 851
888 int32_t ModuleFileUtility::InitPreEncodedWriting( 852 int32_t ModuleFileUtility::InitPreEncodedWriting(
889 OutStream& out, 853 OutStream& out,
890 const CodecInst& codecInst) 854 const CodecInst& codecInst)
891 { 855 {
892 856
893 if(set_codec_info(codecInst) != 0) 857 if(set_codec_info(codecInst) != 0)
894 { 858 {
895 WEBRTC_TRACE(kTraceError, kTraceFile, _id, "CodecInst not recognized!"); 859 WEBRTC_TRACE(kTraceError, kTraceFile, _id, "CodecInst not recognized!");
896 return -1; 860 return -1;
897 } 861 }
898 _writing = true; 862 _writing = true;
899 _bytesWritten = 1; 863 _bytesWritten = 1;
900 out.Write(&_codecId, 1); 864 out.Write(&_codecId, 1);
901 return 0; 865 return 0;
902 } 866 }
903 867
904 int32_t ModuleFileUtility::WritePreEncodedData( 868 int32_t ModuleFileUtility::WritePreEncodedData(
905 OutStream& out, 869 OutStream& out,
906 const int8_t* buffer, 870 const int8_t* buffer,
907 const size_t dataLength) 871 const size_t dataLength)
908 { 872 {
909 WEBRTC_TRACE( 873 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
910 kTraceStream, 874 "ModuleFileUtility::WritePreEncodedData(out= 0x%x, "
911 kTraceFile, 875 "inData= 0x%x, dataLen= %" PRIuS ")", &out, buffer,
912 _id, 876 dataLength);
913 "ModuleFileUtility::WritePreEncodedData(out= 0x%x, inData= 0x%x, "
914 "dataLen= %" PRIuS ")",
915 &out,
916 buffer,
917 dataLength);
918 877
919 if(buffer == NULL) 878 if(buffer == NULL)
920 { 879 {
921 WEBRTC_TRACE(kTraceError, kTraceFile, _id,"buffer NULL"); 880 WEBRTC_TRACE(kTraceError, kTraceFile, _id,"buffer NULL");
922 } 881 }
923 882
924 size_t bytesWritten = 0; 883 size_t bytesWritten = 0;
925 // The first two bytes is the size of the frame. 884 // The first two bytes is the size of the frame.
926 int16_t lengthBuf; 885 int16_t lengthBuf;
927 lengthBuf = (int16_t)dataLength; 886 lengthBuf = (int16_t)dataLength;
(...skipping 10 matching lines...) Expand all
938 } 897 }
939 bytesWritten += dataLength; 898 bytesWritten += dataLength;
940 return static_cast<int32_t>(bytesWritten); 899 return static_cast<int32_t>(bytesWritten);
941 } 900 }
942 901
943 int32_t ModuleFileUtility::InitCompressedReading( 902 int32_t ModuleFileUtility::InitCompressedReading(
944 InStream& in, 903 InStream& in,
945 const uint32_t start, 904 const uint32_t start,
946 const uint32_t stop) 905 const uint32_t stop)
947 { 906 {
948 WEBRTC_TRACE( 907 WEBRTC_TRACE(kTraceDebug, kTraceFile, _id,
949 kTraceDebug, 908 "ModuleFileUtility::InitCompressedReading(in= 0x%x, "
950 kTraceFile, 909 "start= %d, stop= %d)", &in, start, stop);
951 _id,
952 "ModuleFileUtility::InitCompressedReading(in= 0x%x, start= %d,\
953 stop= %d)",
954 &in,
955 start,
956 stop);
957 910
958 #if defined(WEBRTC_CODEC_ILBC) 911 #if defined(WEBRTC_CODEC_ILBC)
959 int16_t read_len = 0; 912 int16_t read_len = 0;
960 #endif 913 #endif
961 _codecId = kCodecNoCodec; 914 _codecId = kCodecNoCodec;
962 _playoutPositionMs = 0; 915 _playoutPositionMs = 0;
963 _reading = false; 916 _reading = false;
964 917
965 _startPointInMs = start; 918 _startPointInMs = start;
966 _stopPointInMs = stop; 919 _stopPointInMs = stop;
967 920
968 // Read the codec name 921 // Read the codec name
969 int32_t cnt = 0; 922 int32_t cnt = 0;
970 char buf[64]; 923 char buf[64];
971 do 924 do
972 { 925 {
973 in.Read(&buf[cnt++], 1); 926 in.Read(&buf[cnt++], 1);
974 } while ((buf[cnt-1] != '\n') && (64 > cnt)); 927 } while ((buf[cnt-1] != '\n') && (64 > cnt));
975 928
976 if(cnt==64) 929 if(cnt==64)
977 { 930 {
978 return -1; 931 return -1;
979 } else {
980 buf[cnt]=0;
981 } 932 }
933 buf[cnt]=0;
982 934
983 #ifdef WEBRTC_CODEC_ILBC 935 #ifdef WEBRTC_CODEC_ILBC
984 if(!strcmp("#!iLBC20\n", buf)) 936 if(!strcmp("#!iLBC20\n", buf))
985 { 937 {
986 codec_info_.pltype = 102; 938 codec_info_.pltype = 102;
987 strcpy(codec_info_.plname, "ilbc"); 939 strcpy(codec_info_.plname, "ilbc");
988 codec_info_.plfreq = 8000; 940 codec_info_.plfreq = 8000;
989 codec_info_.pacsize = 160; 941 codec_info_.pacsize = 160;
990 codec_info_.channels = 1; 942 codec_info_.channels = 1;
991 codec_info_.rate = 13300; 943 codec_info_.rate = 13300;
992 _codecId = kCodecIlbc20Ms; 944 _codecId = kCodecIlbc20Ms;
993 945
994 if(_startPointInMs > 0) 946 if(_startPointInMs > 0)
995 { 947 {
996 while (_playoutPositionMs <= _startPointInMs) 948 while (_playoutPositionMs <= _startPointInMs)
997 { 949 {
998 read_len = in.Read(buf, 38); 950 read_len = in.Read(buf, 38);
999 if(read_len == 38) 951 if(read_len != 38)
1000 {
1001 _playoutPositionMs += 20;
1002 }
1003 else
1004 { 952 {
1005 return -1; 953 return -1;
1006 } 954 }
955 _playoutPositionMs += 20;
1007 } 956 }
1008 } 957 }
1009 } 958 }
1010 959
1011 if(!strcmp("#!iLBC30\n", buf)) 960 if(!strcmp("#!iLBC30\n", buf))
1012 { 961 {
1013 codec_info_.pltype = 102; 962 codec_info_.pltype = 102;
1014 strcpy(codec_info_.plname, "ilbc"); 963 strcpy(codec_info_.plname, "ilbc");
1015 codec_info_.plfreq = 8000; 964 codec_info_.plfreq = 8000;
1016 codec_info_.pacsize = 240; 965 codec_info_.pacsize = 240;
1017 codec_info_.channels = 1; 966 codec_info_.channels = 1;
1018 codec_info_.rate = 13300; 967 codec_info_.rate = 13300;
1019 _codecId = kCodecIlbc30Ms; 968 _codecId = kCodecIlbc30Ms;
1020 969
1021 if(_startPointInMs > 0) 970 if(_startPointInMs > 0)
1022 { 971 {
1023 while (_playoutPositionMs <= _startPointInMs) 972 while (_playoutPositionMs <= _startPointInMs)
1024 { 973 {
1025 read_len = in.Read(buf, 50); 974 read_len = in.Read(buf, 50);
1026 if(read_len == 50) 975 if(read_len != 50)
1027 {
1028 _playoutPositionMs += 20;
1029 }
1030 else
1031 { 976 {
1032 return -1; 977 return -1;
1033 } 978 }
979 _playoutPositionMs += 20;
1034 } 980 }
1035 } 981 }
1036 } 982 }
1037 #endif 983 #endif
1038 if(_codecId == kCodecNoCodec) 984 if(_codecId == kCodecNoCodec)
1039 { 985 {
1040 return -1; 986 return -1;
1041 } 987 }
1042 _reading = true; 988 _reading = true;
1043 return 0; 989 return 0;
1044 } 990 }
1045 991
1046 int32_t ModuleFileUtility::ReadCompressedData(InStream& in, 992 int32_t ModuleFileUtility::ReadCompressedData(InStream& in,
1047 int8_t* outData, 993 int8_t* outData,
1048 size_t bufferSize) 994 size_t bufferSize)
1049 { 995 {
1050 WEBRTC_TRACE( 996 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
1051 kTraceStream, 997 "ModuleFileUtility::ReadCompressedData(in=0x%x, outData=0x%x, "
1052 kTraceFile, 998 "bytes=%" PRIuS ")", &in, outData, bufferSize);
1053 _id,
1054 "ModuleFileUtility::ReadCompressedData(in=0x%x, outData=0x%x, bytes=%"
1055 PRIuS ")",
1056 &in,
1057 outData,
1058 bufferSize);
1059 999
1060 uint32_t bytesRead = 0; 1000 int bytesRead = 0;
1061 1001
1062 if(! _reading) 1002 if(! _reading)
1063 { 1003 {
1064 WEBRTC_TRACE(kTraceError, kTraceFile, _id, "not currently reading!"); 1004 WEBRTC_TRACE(kTraceError, kTraceFile, _id, "not currently reading!");
1065 return -1; 1005 return -1;
1066 } 1006 }
1067 1007
1068 #ifdef WEBRTC_CODEC_ILBC 1008 #ifdef WEBRTC_CODEC_ILBC
1069 if((_codecId == kCodecIlbc20Ms) || 1009 if((_codecId == kCodecIlbc20Ms) ||
1070 (_codecId == kCodecIlbc30Ms)) 1010 (_codecId == kCodecIlbc30Ms))
1071 { 1011 {
1072 uint32_t byteSize = 0; 1012 size_t byteSize = 0;
1073 if(_codecId == kCodecIlbc30Ms) 1013 if(_codecId == kCodecIlbc30Ms)
1074 { 1014 {
1075 byteSize = 50; 1015 byteSize = 50;
1076 } 1016 }
1077 if(_codecId == kCodecIlbc20Ms) 1017 if(_codecId == kCodecIlbc20Ms)
1078 { 1018 {
1079 byteSize = 38; 1019 byteSize = 38;
1080 } 1020 }
1081 if(bufferSize < byteSize) 1021 if(bufferSize < byteSize)
1082 { 1022 {
1083 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 1023 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
1084 "output buffer is too short to read ILBC compressed\ 1024 "output buffer is too short to read ILBC compressed "
1085 data."); 1025 "data.");
1086 assert(false); 1026 assert(false);
1087 return -1; 1027 return -1;
1088 } 1028 }
1089 1029
1090 bytesRead = in.Read(outData, byteSize); 1030 bytesRead = in.Read(outData, byteSize);
1091 if(bytesRead != byteSize) 1031 if(bytesRead != static_cast<int>(byteSize))
1092 { 1032 {
1093 if(!in.Rewind()) 1033 if(!in.Rewind())
1094 { 1034 {
1095 InitCompressedReading(in, _startPointInMs, _stopPointInMs); 1035 InitCompressedReading(in, _startPointInMs, _stopPointInMs);
1096 bytesRead = in.Read(outData, byteSize); 1036 bytesRead = in.Read(outData, byteSize);
1097 if(bytesRead != byteSize) 1037 if(bytesRead != static_cast<int>(byteSize))
1098 { 1038 {
1099 _reading = false; 1039 _reading = false;
1100 return -1; 1040 return -1;
1101 } 1041 }
1102 } 1042 }
1103 else 1043 else
1104 { 1044 {
1105 _reading = false; 1045 _reading = false;
1106 return -1; 1046 return -1;
1107 } 1047 }
(...skipping 21 matching lines...) Expand all
1129 } 1069 }
1130 } 1070 }
1131 return bytesRead; 1071 return bytesRead;
1132 } 1072 }
1133 1073
1134 int32_t ModuleFileUtility::InitCompressedWriting( 1074 int32_t ModuleFileUtility::InitCompressedWriting(
1135 OutStream& out, 1075 OutStream& out,
1136 const CodecInst& codecInst) 1076 const CodecInst& codecInst)
1137 { 1077 {
1138 WEBRTC_TRACE(kTraceDebug, kTraceFile, _id, 1078 WEBRTC_TRACE(kTraceDebug, kTraceFile, _id,
1139 "ModuleFileUtility::InitCompressedWriting(out= 0x%x,\ 1079 "ModuleFileUtility::InitCompressedWriting(out= 0x%x, "
1140 codecName= %s)", 1080 "codecName= %s)", &out, codecInst.plname);
1141 &out, codecInst.plname);
1142 1081
1143 _writing = false; 1082 _writing = false;
1144 1083
1145 #ifdef WEBRTC_CODEC_ILBC 1084 #ifdef WEBRTC_CODEC_ILBC
1146 if(STR_CASE_CMP(codecInst.plname, "ilbc") == 0) 1085 if(STR_CASE_CMP(codecInst.plname, "ilbc") == 0)
1147 { 1086 {
1148 if(codecInst.pacsize == 160) 1087 if(codecInst.pacsize == 160)
1149 { 1088 {
1150 _codecId = kCodecIlbc20Ms; 1089 _codecId = kCodecIlbc20Ms;
1151 out.Write("#!iLBC20\n",9); 1090 out.Write("#!iLBC20\n",9);
(...skipping 18 matching lines...) Expand all
1170 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 1109 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
1171 "codecInst defines unsupported compression codec!"); 1110 "codecInst defines unsupported compression codec!");
1172 return -1; 1111 return -1;
1173 } 1112 }
1174 1113
1175 int32_t ModuleFileUtility::WriteCompressedData( 1114 int32_t ModuleFileUtility::WriteCompressedData(
1176 OutStream& out, 1115 OutStream& out,
1177 const int8_t* buffer, 1116 const int8_t* buffer,
1178 const size_t dataLength) 1117 const size_t dataLength)
1179 { 1118 {
1180 WEBRTC_TRACE( 1119 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
1181 kTraceStream, 1120 "ModuleFileUtility::WriteCompressedData(out= 0x%x, buf= 0x%x, "
1182 kTraceFile, 1121 "dataLen= %" PRIuS ")", &out, buffer, dataLength);
1183 _id,
1184 "ModuleFileUtility::WriteCompressedData(out= 0x%x, buf= 0x%x, "
1185 "dataLen= %" PRIuS ")",
1186 &out,
1187 buffer,
1188 dataLength);
1189 1122
1190 if(buffer == NULL) 1123 if(buffer == NULL)
1191 { 1124 {
1192 WEBRTC_TRACE(kTraceError, kTraceFile, _id,"buffer NULL"); 1125 WEBRTC_TRACE(kTraceError, kTraceFile, _id,"buffer NULL");
1193 } 1126 }
1194 1127
1195 if(!out.Write(buffer, dataLength)) 1128 if(!out.Write(buffer, dataLength))
1196 { 1129 {
1197 return -1; 1130 return -1;
1198 } 1131 }
1199 return static_cast<int32_t>(dataLength); 1132 return static_cast<int32_t>(dataLength);
1200 } 1133 }
1201 1134
1202 int32_t ModuleFileUtility::InitPCMReading(InStream& pcm, 1135 int32_t ModuleFileUtility::InitPCMReading(InStream& pcm,
1203 const uint32_t start, 1136 const uint32_t start,
1204 const uint32_t stop, 1137 const uint32_t stop,
1205 uint32_t freq) 1138 uint32_t freq)
1206 { 1139 {
1207 WEBRTC_TRACE( 1140 WEBRTC_TRACE(kTraceInfo, kTraceFile, _id,
1208 kTraceInfo, 1141 "ModuleFileUtility::InitPCMReading(pcm= 0x%x, start=%d, "
1209 kTraceFile, 1142 "stop=%d, freq=%d)", &pcm, start, stop, freq);
1210 _id,
1211 "ModuleFileUtility::InitPCMReading(pcm= 0x%x, start=%d, stop=%d,\
1212 freq=%d)",
1213 &pcm,
1214 start,
1215 stop,
1216 freq);
1217 1143
1218 int8_t dummy[320]; 1144 int8_t dummy[320];
1219 int32_t read_len; 1145 int read_len;
1220 1146
1221 _playoutPositionMs = 0; 1147 _playoutPositionMs = 0;
1222 _startPointInMs = start; 1148 _startPointInMs = start;
1223 _stopPointInMs = stop; 1149 _stopPointInMs = stop;
1224 _reading = false; 1150 _reading = false;
1225 1151
1226 if(freq == 8000) 1152 if(freq == 8000)
1227 { 1153 {
1228 strcpy(codec_info_.plname, "L16"); 1154 strcpy(codec_info_.plname, "L16");
1229 codec_info_.pltype = -1; 1155 codec_info_.pltype = -1;
(...skipping 24 matching lines...) Expand all
1254 _codecId = kCodecL16_32Khz; 1180 _codecId = kCodecL16_32Khz;
1255 } 1181 }
1256 1182
1257 // Readsize for 10ms of audio data (2 bytes per sample). 1183 // Readsize for 10ms of audio data (2 bytes per sample).
1258 _readSizeBytes = 2 * codec_info_. plfreq / 100; 1184 _readSizeBytes = 2 * codec_info_. plfreq / 100;
1259 if(_startPointInMs > 0) 1185 if(_startPointInMs > 0)
1260 { 1186 {
1261 while (_playoutPositionMs < _startPointInMs) 1187 while (_playoutPositionMs < _startPointInMs)
1262 { 1188 {
1263 read_len = pcm.Read(dummy, _readSizeBytes); 1189 read_len = pcm.Read(dummy, _readSizeBytes);
1264 if(read_len == _readSizeBytes) 1190 if(read_len != static_cast<int>(_readSizeBytes))
1265 { 1191 {
1266 _playoutPositionMs += 10; 1192 return -1; // Must have reached EOF before start position!
1267 } 1193 }
1268 else // Must have reached EOF before start position! 1194 _playoutPositionMs += 10;
1269 {
1270 return -1;
1271 }
1272 } 1195 }
1273 } 1196 }
1274 _reading = true; 1197 _reading = true;
1275 return 0; 1198 return 0;
1276 } 1199 }
1277 1200
1278 int32_t ModuleFileUtility::ReadPCMData(InStream& pcm, 1201 int32_t ModuleFileUtility::ReadPCMData(InStream& pcm,
1279 int8_t* outData, 1202 int8_t* outData,
1280 size_t bufferSize) 1203 size_t bufferSize)
1281 { 1204 {
1282 WEBRTC_TRACE( 1205 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
1283 kTraceStream, 1206 "ModuleFileUtility::ReadPCMData(pcm= 0x%x, outData= 0x%x, "
1284 kTraceFile, 1207 "bufSize= %" PRIuS ")", &pcm, outData, bufferSize);
1285 _id,
1286 "ModuleFileUtility::ReadPCMData(pcm= 0x%x, outData= 0x%x, bufSize= %"
1287 PRIuS ")",
1288 &pcm,
1289 outData,
1290 bufferSize);
1291 1208
1292 if(outData == NULL) 1209 if(outData == NULL)
1293 { 1210 {
1294 WEBRTC_TRACE(kTraceError, kTraceFile, _id,"buffer NULL"); 1211 WEBRTC_TRACE(kTraceError, kTraceFile, _id, "buffer NULL");
1295 } 1212 }
1296 1213
1297 // Readsize for 10ms of audio data (2 bytes per sample). 1214 // Readsize for 10ms of audio data (2 bytes per sample).
1298 uint32_t bytesRequested = 2 * codec_info_.plfreq / 100; 1215 size_t bytesRequested = static_cast<size_t>(2 * codec_info_.plfreq / 100);
1299 if(bufferSize < bytesRequested) 1216 if(bufferSize < bytesRequested)
1300 { 1217 {
1301 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 1218 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
1302 "ReadPCMData: buffer not long enough for a 10ms frame."); 1219 "ReadPCMData: buffer not long enough for a 10ms frame.");
1303 assert(false); 1220 assert(false);
1304 return -1; 1221 return -1;
1305 } 1222 }
1306 1223
1307 uint32_t bytesRead = pcm.Read(outData, bytesRequested); 1224 int bytesRead = pcm.Read(outData, bytesRequested);
1308 if(bytesRead < bytesRequested) 1225 if(bytesRead < static_cast<int>(bytesRequested))
1309 { 1226 {
1310 if(pcm.Rewind() == -1) 1227 if(pcm.Rewind() == -1)
1311 { 1228 {
1312 _reading = false; 1229 _reading = false;
1313 } 1230 }
1314 else 1231 else
1315 { 1232 {
1316 if(InitPCMReading(pcm, _startPointInMs, _stopPointInMs, 1233 if(InitPCMReading(pcm, _startPointInMs, _stopPointInMs,
1317 codec_info_.plfreq) == -1) 1234 codec_info_.plfreq) == -1)
1318 { 1235 {
1319 _reading = false; 1236 _reading = false;
1320 } 1237 }
1321 else 1238 else
1322 { 1239 {
1323 int32_t rest = bytesRequested - bytesRead; 1240 size_t rest = bytesRequested - bytesRead;
1324 int32_t len = pcm.Read(&(outData[bytesRead]), rest); 1241 int len = pcm.Read(&(outData[bytesRead]), rest);
1325 if(len == rest) 1242 if(len == static_cast<int>(rest))
1326 { 1243 {
1327 bytesRead += len; 1244 bytesRead += len;
1328 } 1245 }
1329 else 1246 else
1330 { 1247 {
1331 _reading = false; 1248 _reading = false;
1332 } 1249 }
1333 } 1250 }
1334 if(bytesRead <= 0) 1251 if(bytesRead <= 0)
1335 { 1252 {
1336 WEBRTC_TRACE(kTraceError, kTraceFile, _id, 1253 WEBRTC_TRACE(kTraceError, kTraceFile, _id,
1337 "ReadPCMData: Failed to rewind audio file."); 1254 "ReadPCMData: Failed to rewind audio file.");
1338 return -1; 1255 return -1;
1339 } 1256 }
1340 } 1257 }
1341 } 1258 }
1342 1259
1343 if(bytesRead <= 0) 1260 if(bytesRead <= 0)
1344 { 1261 {
1345 WEBRTC_TRACE(kTraceStream, kTraceFile, _id, 1262 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
1346 "ReadPCMData: end of file"); 1263 "ReadPCMData: end of file");
1347 return -1; 1264 return -1;
1348 } 1265 }
1349 _playoutPositionMs += 10; 1266 _playoutPositionMs += 10;
1350 if(_stopPointInMs && _playoutPositionMs >= _stopPointInMs) 1267 if(_stopPointInMs && _playoutPositionMs >= _stopPointInMs)
1351 { 1268 {
1352 if(!pcm.Rewind()) 1269 if(!pcm.Rewind())
1353 { 1270 {
1354 if(InitPCMReading(pcm, _startPointInMs, _stopPointInMs, 1271 if(InitPCMReading(pcm, _startPointInMs, _stopPointInMs,
1355 codec_info_.plfreq) == -1) 1272 codec_info_.plfreq) == -1)
1356 { 1273 {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1407 } 1324 }
1408 _writing = true; 1325 _writing = true;
1409 _bytesWritten = 0; 1326 _bytesWritten = 0;
1410 return 0; 1327 return 0;
1411 } 1328 }
1412 1329
1413 int32_t ModuleFileUtility::WritePCMData(OutStream& out, 1330 int32_t ModuleFileUtility::WritePCMData(OutStream& out,
1414 const int8_t* buffer, 1331 const int8_t* buffer,
1415 const size_t dataLength) 1332 const size_t dataLength)
1416 { 1333 {
1417 WEBRTC_TRACE( 1334 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
1418 kTraceStream, 1335 "ModuleFileUtility::WritePCMData(out= 0x%x, buf= 0x%x, "
1419 kTraceFile, 1336 "dataLen= %" PRIuS ")", &out, buffer, dataLength);
1420 _id,
1421 "ModuleFileUtility::WritePCMData(out= 0x%x, buf= 0x%x, dataLen= %" PRIuS
1422 ")",
1423 &out,
1424 buffer,
1425 dataLength);
1426 1337
1427 if(buffer == NULL) 1338 if(buffer == NULL)
1428 { 1339 {
1429 WEBRTC_TRACE(kTraceError, kTraceFile, _id, "buffer NULL"); 1340 WEBRTC_TRACE(kTraceError, kTraceFile, _id, "buffer NULL");
1430 } 1341 }
1431 1342
1432 if(!out.Write(buffer, dataLength)) 1343 if(!out.Write(buffer, dataLength))
1433 { 1344 {
1434 return -1; 1345 return -1;
1435 } 1346 }
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
1578 case kFileFormatPcm8kHzFile: 1489 case kFileFormatPcm8kHzFile:
1579 { 1490 {
1580 // 8 samples per ms. 2 bytes per sample. 1491 // 8 samples per ms. 2 bytes per sample.
1581 int32_t denominator = 8*2; 1492 int32_t denominator = 8*2;
1582 time_in_ms = (file_size.st_size)/denominator; 1493 time_in_ms = (file_size.st_size)/denominator;
1583 break; 1494 break;
1584 } 1495 }
1585 case kFileFormatCompressedFile: 1496 case kFileFormatCompressedFile:
1586 { 1497 {
1587 int32_t cnt = 0; 1498 int32_t cnt = 0;
1588 int32_t read_len = 0; 1499 int read_len = 0;
1589 char buf[64]; 1500 char buf[64];
1590 do 1501 do
1591 { 1502 {
1592 read_len = inStreamObj->Read(&buf[cnt++], 1); 1503 read_len = inStreamObj->Read(&buf[cnt++], 1);
1593 if(read_len != 1) 1504 if(read_len != 1)
1594 { 1505 {
1595 return -1; 1506 return -1;
1596 } 1507 }
1597 } while ((buf[cnt-1] != '\n') && (64 > cnt)); 1508 } while ((buf[cnt-1] != '\n') && (64 > cnt));
1598 1509
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1635 break; 1546 break;
1636 } 1547 }
1637 inStreamObj->CloseFile(); 1548 inStreamObj->CloseFile();
1638 delete inStreamObj; 1549 delete inStreamObj;
1639 return time_in_ms; 1550 return time_in_ms;
1640 } 1551 }
1641 1552
1642 uint32_t ModuleFileUtility::PlayoutPositionMs() 1553 uint32_t ModuleFileUtility::PlayoutPositionMs()
1643 { 1554 {
1644 WEBRTC_TRACE(kTraceStream, kTraceFile, _id, 1555 WEBRTC_TRACE(kTraceStream, kTraceFile, _id,
1645 "ModuleFileUtility::PlayoutPosition()"); 1556 "ModuleFileUtility::PlayoutPosition()");
1646 1557
1647 if(_reading) 1558 return _reading ? _playoutPositionMs : 0;
1648 {
1649 return _playoutPositionMs;
1650 }
1651 else
1652 {
1653 return 0;
1654 }
1655 } 1559 }
1656 } // namespace webrtc 1560 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/media_file/media_file_utility.h ('k') | webrtc/system_wrappers/include/aligned_array.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698