Home | History | Annotate | Download | only in wifi-display
      1 /*
      2  * Copyright 2013, 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 
     17 #ifndef VIDEO_FORMATS_H_
     18 
     19 #define VIDEO_FORMATS_H_
     20 
     21 #include <media/stagefright/foundation/ABase.h>
     22 
     23 #include <stdint.h>
     24 
     25 namespace android {
     26 
     27 struct AString;
     28 
     29 // This class encapsulates that video resolution capabilities of a wfd source
     30 // or sink as outlined in the wfd specs. Currently three sets of resolutions
     31 // are specified, each of which supports up to 32 resolutions.
     32 // In addition to its capabilities each sink/source also publishes its
     33 // "native" resolution, presumably one that is preferred among all others
     34 // because it wouldn't require any scaling and directly corresponds to the
     35 // display capabilities/pixels.
     36 struct VideoFormats {
     37     VideoFormats();
     38 
     39     struct config_t {
     40         size_t width, height, framesPerSecond;
     41         bool interlaced;
     42         unsigned char profile, level;
     43     };
     44 
     45     enum ProfileType {
     46         PROFILE_CBP = 0,
     47         PROFILE_CHP,
     48         kNumProfileTypes,
     49     };
     50 
     51     enum LevelType {
     52         LEVEL_31 = 0,
     53         LEVEL_32,
     54         LEVEL_40,
     55         LEVEL_41,
     56         LEVEL_42,
     57         kNumLevelTypes,
     58     };
     59 
     60     enum ResolutionType {
     61         RESOLUTION_CEA,
     62         RESOLUTION_VESA,
     63         RESOLUTION_HH,
     64         kNumResolutionTypes,
     65     };
     66 
     67     void setNativeResolution(ResolutionType type, size_t index);
     68     void getNativeResolution(ResolutionType *type, size_t *index) const;
     69 
     70     void disableAll();
     71     void enableAll();
     72 
     73     void setResolutionEnabled(
     74             ResolutionType type, size_t index, bool enabled = true);
     75 
     76     bool isResolutionEnabled(ResolutionType type, size_t index) const;
     77 
     78     static bool GetConfiguration(
     79             ResolutionType type, size_t index,
     80             size_t *width, size_t *height, size_t *framesPerSecond,
     81             bool *interlaced);
     82 
     83     bool parseFormatSpec(const char *spec);
     84     AString getFormatSpec(bool forM4Message = false) const;
     85 
     86     static bool PickBestFormat(
     87             const VideoFormats &sinkSupported,
     88             const VideoFormats &sourceSupported,
     89             ResolutionType *chosenType,
     90             size_t *chosenIndex);
     91 
     92 private:
     93     bool parseH264Codec(const char *spec);
     94     ResolutionType mNativeType;
     95     size_t mNativeIndex;
     96 
     97     uint32_t mResolutionEnabled[kNumResolutionTypes];
     98     static config_t mConfigs[kNumResolutionTypes][32];
     99 
    100     DISALLOW_EVIL_CONSTRUCTORS(VideoFormats);
    101 };
    102 
    103 }  // namespace android
    104 
    105 #endif  // VIDEO_FORMATS_H_
    106 
    107