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 sp<MediaPlayerBase> createPlayer() = 0;
47    };
48
49    static status_t registerFactory(IFactory* factory,
50                                    player_type type);
51    static void unregisterFactory(player_type type);
52    static player_type getPlayerType(const sp<IMediaPlayer>& client,
53                                     const char* url);
54    static player_type getPlayerType(const sp<IMediaPlayer>& client,
55                                     int fd,
56                                     int64_t offset,
57                                     int64_t length);
58    static player_type getPlayerType(const sp<IMediaPlayer>& client,
59                                     const sp<IStreamSource> &source);
60
61    static sp<MediaPlayerBase> createPlayer(player_type playerType,
62                                            void* cookie,
63                                            notify_callback_f notifyFunc);
64
65    static void registerBuiltinFactories();
66
67  private:
68    typedef KeyedVector<player_type, IFactory*> tFactoryMap;
69
70    MediaPlayerFactory() { }
71
72    static status_t registerFactory_l(IFactory* factory,
73                                      player_type type);
74    static player_type getDefaultPlayerType();
75
76    static Mutex       sLock;
77    static tFactoryMap sFactoryMap;
78    static bool        sInitComplete;
79
80    DISALLOW_EVIL_CONSTRUCTORS(MediaPlayerFactory);
81};
82
83}  // namespace android
84#endif  // ANDROID_MEDIAPLAYERFACTORY_H
85