127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/*
227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2010 The Android Open Source Project
327c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License");
527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License.
627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at
727c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
827c174483a8ae9688d5d4897c19074f62c7f1701James Dong *      http://www.apache.org/licenses/LICENSE-2.0
927c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software
1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and
1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License.
1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */
1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong
1714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber//#define LOG_NDEBUG 0
1814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#define LOG_TAG "AHierarchicalStateMachine"
1914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include <utils/Log.h>
2014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AHierarchicalStateMachine.h>
22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Vector.h>
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
27f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
29f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAState::AState(const sp<AState> &parentState)
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mParentState(parentState) {
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
33f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAState::~AState() {
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
36f933441648ef6a71dee783d733aac17b9508b452Andreas Hubersp<AState> AState::parentState() {
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return mParentState;
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
40f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AState::stateEntered() {
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
43f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AState::stateExited() {
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
48f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAHierarchicalStateMachine::AHierarchicalStateMachine() {
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
51f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAHierarchicalStateMachine::~AHierarchicalStateMachine() {
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarvoid AHierarchicalStateMachine::handleMessage(const sp<AMessage> &msg) {
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AState> save = mState;
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AState> cur = mState;
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (cur != NULL && !cur->onMessageReceived(msg)) {
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // If you claim not to have handled the message you shouldn't
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // have called setState...
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(save == mState);
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cur = cur->parentState();
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (cur != NULL) {
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
705ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block    ALOGW("Warning message %s unhandled in root state.",
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         msg->debugString().c_str());
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
74f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AHierarchicalStateMachine::changeState(const sp<AState> &state) {
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (state == mState) {
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // Quick exit for the easy case.
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Vector<sp<AState> > A;
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AState> cur = mState;
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (;;) {
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        A.push(cur);
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (cur == NULL) {
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cur = cur->parentState();
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Vector<sp<AState> > B;
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    cur = state;
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (;;) {
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        B.push(cur);
94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (cur == NULL) {
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cur = cur->parentState();
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // Remove the common tail.
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (A.size() > 0 && B.size() > 0 && A.top() == B.top()) {
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        A.pop();
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        B.pop();
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mState = state;
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < A.size(); ++i) {
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        A.editItemAt(i)->stateExited();
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
112938e2b34b16c3c1fd29c753eeb53ee95a2b2e2b3Nick Kralevich    for (size_t i = B.size(); i > 0;) {
113938e2b34b16c3c1fd29c753eeb53ee95a2b2e2b3Nick Kralevich        i--;
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        B.editItemAt(i)->stateEntered();
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
119