/media/libstagefright/MediaExtractor.cpp

https://github.com/antslava/platform_frameworks_base · C++ · 100 lines · 67 code · 16 blank · 17 comment · 23 complexity · 1d36389ae2ca4c60a17f3214876169fc MD5 · raw file

  1. /*
  2. * Copyright (C) 2009 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. //#define LOG_NDEBUG 0
  17. #define LOG_TAG "MediaExtractor"
  18. #include <utils/Log.h>
  19. #include "include/AMRExtractor.h"
  20. #include "include/MP3Extractor.h"
  21. #include "include/MPEG4Extractor.h"
  22. #include "include/WAVExtractor.h"
  23. #include "include/OggExtractor.h"
  24. #include "include/MPEG2TSExtractor.h"
  25. #include "include/DRMExtractor.h"
  26. #include "matroska/MatroskaExtractor.h"
  27. #include <media/stagefright/foundation/AMessage.h>
  28. #include <media/stagefright/DataSource.h>
  29. #include <media/stagefright/MediaDefs.h>
  30. #include <media/stagefright/MediaExtractor.h>
  31. #include <media/stagefright/MetaData.h>
  32. #include <utils/String8.h>
  33. namespace android {
  34. sp<MetaData> MediaExtractor::getMetaData() {
  35. return new MetaData;
  36. }
  37. uint32_t MediaExtractor::flags() const {
  38. return CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_PAUSE | CAN_SEEK;
  39. }
  40. // static
  41. sp<MediaExtractor> MediaExtractor::Create(
  42. const sp<DataSource> &source, const char *mime) {
  43. sp<AMessage> meta;
  44. String8 tmp;
  45. if (mime == NULL) {
  46. float confidence;
  47. if (!source->sniff(&tmp, &confidence, &meta)) {
  48. LOGV("FAILED to autodetect media content.");
  49. return NULL;
  50. }
  51. mime = tmp.string();
  52. LOGV("Autodetected media content as '%s' with confidence %.2f",
  53. mime, confidence);
  54. }
  55. if (!strncmp(mime, "drm", 3)) {
  56. const char *originalMime = strrchr(mime, '+') + 1;
  57. if (!strncmp(mime, "drm+es_based", 12)) {
  58. return new DRMExtractor(source, originalMime);
  59. } else if (!strncmp(mime, "drm+container_based", 19)) {
  60. mime = originalMime;
  61. } else {
  62. return NULL;
  63. }
  64. }
  65. if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4)
  66. || !strcasecmp(mime, "audio/mp4")) {
  67. return new MPEG4Extractor(source);
  68. } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
  69. return new MP3Extractor(source, meta);
  70. } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)
  71. || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
  72. return new AMRExtractor(source);
  73. } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WAV)) {
  74. return new WAVExtractor(source);
  75. } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_OGG)) {
  76. return new OggExtractor(source);
  77. } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MATROSKA)) {
  78. return new MatroskaExtractor(source);
  79. } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) {
  80. return new MPEG2TSExtractor(source);
  81. }
  82. return NULL;
  83. }
  84. } // namespace android