1/*
2**
3** Copyright 2012, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#ifndef ANDROID_MEDIAPLAYERFACTORY_H
19#define ANDROID_MEDIAPLAYERFACTORY_H
20
21#include <media/MediaPlayerInterface.h>
22#include <media/stagefright/foundation/ABase.h>
23
24namespace android {
25
26class MediaPlayerFactory {
27  public:
28    class IFactory {
29      public:
30        virtual ~IFactory() { }
31
32        virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
33                                   const char* /*url*/,
34                                   float /*curScore*/) { return 0.0; }
35
36        virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
37                                   int /*fd*/,
38                                   int64_t /*offset*/,
39                                   int64_t /*length*/,
40                                   float /*curScore*/) { return 0.0; }
41
42        virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
43                                   const sp<IStreamSource> &/*source*/,
44                                   float /*curScore*/) { return 0.0; }
45
46        virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
47                                   const sp<DataSource> &/*source*/,
48                                   float /*curScore*/) { return 0.0; }
49
50        virtual sp<MediaPlayerBase> createPlayer(pid_t pid) = 0;
51    };
52
53    static status_t registerFactory(IFactory* factory,
54                                    player_type type);
55    static void unregisterFactory(player_type type);
56    static player_type getPlayerType(const sp<IMediaPlayer>& client,
57                                     const char* url);
58    static player_type getPlayerType(const sp<IMediaPlayer>& client,
59                                     int fd,
60                                     int64_t offset,
61                                     int64_t length);
62    static player_type getPlayerType(const sp<IMediaPlayer>& client,
63                                     const sp<IStreamSource> &source);
64    static player_type getPlayerType(const sp<IMediaPlayer>& client,
65                                     const sp<DataSource> &source);
66
67    static sp<MediaPlayerBase> createPlayer(player_type playerType,
68                                            void* cookie,
69                                            notify_callback_f notifyFunc,
70                                            pid_t pid);
71
72    static void registerBuiltinFactories();
73
74  private:
75    typedef KeyedVector<player_type, IFactory*> tFactoryMap;
76
77    MediaPlayerFactory() { }
78
79    static status_t registerFactory_l(IFactory* factory,
80                                      player_type type);
81
82    static Mutex       sLock;
83    static tFactoryMap sFactoryMap;
84    static bool        sInitComplete;
85
86    DISALLOW_EVIL_CONSTRUCTORS(MediaPlayerFactory);
87};
88
89}  // namespace android
90#endif  // ANDROID_MEDIAPLAYERFACTORY_H
91