안드로이드에 새로운 플레이어를 추가하기 위해서 수정해야 할 부분

frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp

에 보면 아래와 같은 코드가 있습니다.

 786 static sp<MediaPlayerBase> createPlayer(player_type playerType, void* cookie,
 787         notify_callback_f notifyFunc)
 788 {
 789     sp<MediaPlayerBase> p;
 790     switch (playerType) {
 791 #ifndef NO_OPENCORE
 792 LOGE(" IN PVPlayer");
 793         case PV_PLAYER:
 794             LOGE(" create PVPlayer");
 795             p = new PVPlayer();
 796             break;
 797 #endif
 798         case SONIVOX_PLAYER:
 799             LOGV(" create MidiFile");
 800             p = new MidiFile();
 801             break;
 802         case VORBIS_PLAYER:
 803             LOGV(" create VorbisPlayer");
 804             p = new VorbisPlayer();
 805             break;
 806 #if BUILD_WITH_FULL_STAGEFRIGHT
 807 LOGE(" IN StagefrightPlayer");
 808         case STAGEFRIGHT_PLAYER:
 809             LOGE(" create StagefrightPlayer");
 810             p = new StagefrightPlayer;
 811             break;
 812 #endif
 813         case TEST_PLAYER:
 814             LOGV("Create Test Player stub");
 815             p = new TestPlayerStub();
 816             break;
 817     }
 818     if (p != NULL) {
 819         if (p->initCheck() == NO_ERROR) {
 820             p->setNotifyCallback(cookie, notifyFunc);
 821         } else {
 822             p.clear();
 823         }
 824     }
 825     if (p == NULL) {
 826         LOGE("Failed to create player object");
 827     }
 828     return p;
 829 }

위와 같이 선택된 플레이어를 생성할 수 있는 것을 볼 수 있는데

이부분에 새로운 플레이어를 생성할 수 있도록 추가해주면 됩니다.

createPlayer 에 들어오는 playerType 은 getPlayerType 이라는 함수에서 처리하게 되는데 이쪽을 보면

 742 player_type getPlayerType(const char* url)
 743 {
 744     if (TestPlayerStub::canBeUsed(url)) {
 745         return TEST_PLAYER;
 746     }
 747
 748     bool useStagefrightForHTTP = false;
 749     char value[PROPERTY_VALUE_MAX];
 750     if (property_get("media.stagefright.enable-http", value, NULL)
 751         && (!strcmp(value, "1") || !strcasecmp(value, "true"))) {
 752         useStagefrightForHTTP = true;
 753     }
 754
 755     // use MidiFile for MIDI extensions
 756     int lenURL = strlen(url);
 757     for (int i = 0; i < NELEM(FILE_EXTS); ++i) {
 758         int len = strlen(FILE_EXTS[i].extension);
 759         int start = lenURL - len;
 760         if (start > 0) {
 761             if (!strncmp(url + start, FILE_EXTS[i].extension, len)) {
 762                 if (FILE_EXTS[i].playertype == VORBIS_PLAYER
 763                     && !strncasecmp(url, "http://", 7)
 764                     && useStagefrightForHTTP) {
 765                     return STAGEFRIGHT_PLAYER;
 766                 }
 767                 return OverrideStagefrightForVorbis(FILE_EXTS[i].playertype);
 768             }
 769         }
 770     }
 771
 772     if (!strncasecmp(url, "http://", 7)) {
 773         if (!useStagefrightForHTTP) {
 774             return PV_PLAYER;
 775         }
 776     }
 777
 778     // Use PV_PLAYER for rtsp for now
 779     if (!strncasecmp(url, "rtsp://", 7)) {
 780         return PV_PLAYER;
 781     }
 782
 783     return getDefaultPlayerType();
 784 }
 
 위와 같이 들어오는 url 을 비교해서 플레이어를 지정해 주게 됩니다.
 
 따라서 우리도 위와 같이 새로운 URL 을 지정하여 재생을 시도하면
 
 우리가 만든 플레이어로 동작하도록 할 수 있습니다.

Posted by Real_G