text: /*
   * Copyright (C) 2008 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  
  #ifndef MEDIAMETADATARETRIEVER_H
  #define MEDIAMETADATARETRIEVER_H
  
  #include <utils/Errors.h>  // for status_t
  #include <utils/threads.h>
  #include <binder/IMemory.h>
  #include <media/IMediaMetadataRetriever.h>
  
  namespace android {
  
  class IDataSource;
  struct IMediaHTTPService;
  class IMediaPlayerService;
  class IMediaMetadataRetriever;
  
  // Keep these in synch with the constants defined in MediaMetadataRetriever.java
  // class.
  enum {
      METADATA_KEY_CD_TRACK_NUMBER = 0,
      METADATA_KEY_ALBUM           = 1,
      METADATA_KEY_ARTIST          = 2,
      METADATA_KEY_AUTHOR          = 3,
      METADATA_KEY_COMPOSER        = 4,
      METADATA_KEY_DATE            = 5,
      METADATA_KEY_GENRE           = 6,
      METADATA_KEY_TITLE           = 7,
      METADATA_KEY_YEAR            = 8,
      METADATA_KEY_DURATION        = 9,
      METADATA_KEY_NUM_TRACKS      = 10,
      METADATA_KEY_WRITER          = 11,
      METADATA_KEY_MIMETYPE        = 12,
      METADATA_KEY_ALBUMARTIST     = 13,
      METADATA_KEY_DISC_NUMBER     = 14,
      METADATA_KEY_COMPILATION     = 15,
      METADATA_KEY_HAS_AUDIO       = 16,
      METADATA_KEY_HAS_VIDEO       = 17,
      METADATA_KEY_VIDEO_WIDTH     = 18,
      METADATA_KEY_VIDEO_HEIGHT    = 19,
      METADATA_KEY_BITRATE         = 20,
      METADATA_KEY_TIMED_TEXT_LANGUAGES      = 21,
      METADATA_KEY_IS_DRM          = 22,
      METADATA_KEY_LOCATION        = 23,
      METADATA_KEY_VIDEO_ROTATION  = 24,
      METADATA_KEY_CAPTURE_FRAMERATE = 25,
      METADATA_KEY_HAS_IMAGE       = 26,
      METADATA_KEY_IMAGE_COUNT     = 27,
      METADATA_KEY_IMAGE_PRIMARY   = 28,
      METADATA_KEY_IMAGE_WIDTH     = 29,
      METADATA_KEY_IMAGE_HEIGHT    = 30,
      METADATA_KEY_IMAGE_ROTATION  = 31,
      METADATA_KEY_VIDEO_FRAME_COUNT  = 32,
      METADATA_KEY_EXIF_OFFSET     = 33,
      METADATA_KEY_EXIF_LENGTH     = 34,
  
      // Add more here...
  };
  
  class MediaMetadataRetriever: public RefBase
  {
  public:
      MediaMetadataRetriever();
      ~MediaMetadataRetriever();
      void disconnect();
  
      status_t setDataSource(
              const sp<IMediaHTTPService> &httpService,
              const char *dataSourceUrl,
              const KeyedVector<String8, String8> *headers = NULL);
  
      status_t setDataSource(int fd, int64_t offset, int64_t length);
      status_t setDataSource(
              const sp<IDataSource>& dataSource, const char *mime = NULL);
      sp<IMemory> getFrameAtTime(int64_t timeUs, int option,
              int colorFormat = HAL_PIXEL_FORMAT_RGB_565, bool metaOnly = false);
      sp<IMemory> getImageAtIndex(int index,
              int colorFormat = HAL_PIXEL_FORMAT_RGB_565, bool metaOnly = false, bool thumbnail = false);
      sp<IMemory> getImageRectAtIndex(
              int index, int colorFormat, int left, int top, int right, int bottom);
      status_t getFrameAtIndex(
              std::vector<sp<IMemory> > *frames, int frameIndex, int numFrames = 1,
              int colorFormat = HAL_PIXEL_FORMAT_RGB_565, bool metaOnly = false);
      sp<IMemory> extractAlbumArt();
      const char* extractMetadata(int keyCode);
  
  private:
      static const sp<IMediaPlayerService> getService();
  
      class DeathNotifier: public IBinder::DeathRecipient
      {
      public:
          DeathNotifier() {}
          virtual ~DeathNotifier();
          virtual void binderDied(const wp<IBinder>& who);
      };
  
      static sp<DeathNotifier>                  sDeathNotifier;
      static Mutex                              sServiceLock;
      static sp<IMediaPlayerService>            sService;
  
      Mutex                                     mLock;
      sp<IMediaMetadataRetriever>               mRetriever;
  
  };
  
  }; // namespace android
  
  #endif // MEDIAMETADATARETRIEVER_H
  