mpeg1_audio_stream_parser.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef MEDIA_FORMATS_MPEG_MPEG1_AUDIO_STREAM_PARSER_H_
  5. #define MEDIA_FORMATS_MPEG_MPEG1_AUDIO_STREAM_PARSER_H_
  6. #include <stdint.h>
  7. #include "media/base/media_export.h"
  8. #include "media/formats/mpeg/mpeg_audio_stream_parser_base.h"
  9. namespace media {
  10. // MPEG1AudioStreamParser handles MPEG-1 audio streams (ISO/IEC 11172-3)
  11. // as well as the following extensions:
  12. // - MPEG-2 audio (ISO/IEC 13818-3),
  13. // - and MPEG2.5 (not an ISO standard).
  14. class MEDIA_EXPORT MPEG1AudioStreamParser : public MPEGAudioStreamParserBase {
  15. public:
  16. // Size of an MPEG-1 frame header in bytes.
  17. static constexpr int kHeaderSize = 4;
  18. // Versions and layers as defined in ISO/IEC 11172-3.
  19. enum Version {
  20. kVersion1 = 3,
  21. kVersion2 = 2,
  22. kVersionReserved = 1,
  23. kVersion2_5 = 0,
  24. };
  25. enum Layer {
  26. kLayer1 = 3,
  27. kLayer2 = 2,
  28. kLayer3 = 1,
  29. kLayerReserved = 0,
  30. };
  31. struct Header {
  32. Version version;
  33. // Layer as defined in ISO/IEC 11172-3 bitstream specification.
  34. Layer layer;
  35. // Frame size in bytes.
  36. int frame_size;
  37. // Sample frequency.
  38. int sample_rate;
  39. // Channel mode as defined in ISO/IEC 11172-3 bitstream specification.
  40. int channel_mode;
  41. // Channel layout.
  42. ChannelLayout channel_layout;
  43. // Number of samples per frame.
  44. int sample_count;
  45. };
  46. // Parses the header starting at |data|.
  47. // Assumption: size of array |data| should be at least |kHeaderSize|.
  48. // Returns false if the header is not valid.
  49. static bool ParseHeader(MediaLog* media_log,
  50. size_t* media_log_limit,
  51. const uint8_t* data,
  52. Header* header);
  53. MPEG1AudioStreamParser();
  54. MPEG1AudioStreamParser(const MPEG1AudioStreamParser&) = delete;
  55. MPEG1AudioStreamParser& operator=(const MPEG1AudioStreamParser&) = delete;
  56. ~MPEG1AudioStreamParser() override;
  57. private:
  58. // MPEGAudioStreamParserBase overrides.
  59. int ParseFrameHeader(const uint8_t* data,
  60. int size,
  61. int* frame_size,
  62. int* sample_rate,
  63. ChannelLayout* channel_layout,
  64. int* sample_count,
  65. bool* metadata_frame,
  66. std::vector<uint8_t>* extra_data) override;
  67. size_t mp3_parse_error_limit_ = 0;
  68. };
  69. } // namespace media
  70. #endif // MEDIA_FORMATS_MPEG_MPEG1_AUDIO_STREAM_PARSER_H_