summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/HTTPStream.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-03-12 08:59:22 -0800
committerAndreas Huber <andih@google.com>2010-03-12 09:05:10 -0800
commitedbb4d8f398dfbce7b766d4bd207685dab582847 (patch)
tree97424243885172334a9905a99eb00fce3b90016e /media/libstagefright/HTTPStream.cpp
parent84eb8d2a7de0a2cec02516b9fb2a61fde536b59c (diff)
downloadframeworks_base-edbb4d8f398dfbce7b766d4bd207685dab582847.zip
frameworks_base-edbb4d8f398dfbce7b766d4bd207685dab582847.tar.gz
frameworks_base-edbb4d8f398dfbce7b766d4bd207685dab582847.tar.bz2
HTTPStream and HTTPDataSource now support cancellation of the connection process, AwesomePlayer takes advantage of this in cases where ::reset() or ::suspend() is called while in the preparation phase to bail out early. Also fixes in issue where the audio codec was not properly stopped if no audio player object ever took ownership.
Change-Id: I6d73defe6d276693853a469db267bb2668d07af5 related-to-bugs: 2475845,2414536
Diffstat (limited to 'media/libstagefright/HTTPStream.cpp')
-rw-r--r--media/libstagefright/HTTPStream.cpp44
1 files changed, 29 insertions, 15 deletions
diff --git a/media/libstagefright/HTTPStream.cpp b/media/libstagefright/HTTPStream.cpp
index 2c5da68..66eadf6 100644
--- a/media/libstagefright/HTTPStream.cpp
+++ b/media/libstagefright/HTTPStream.cpp
@@ -44,12 +44,19 @@ HTTPStream::~HTTPStream() {
}
status_t HTTPStream::connect(const char *server, int port) {
+ Mutex::Autolock autoLock(mLock);
+
status_t err = OK;
if (mState == CONNECTED) {
return ERROR_ALREADY_CONNECTED;
}
+ struct hostent *ent = gethostbyname(server);
+ if (ent == NULL) {
+ return ERROR_UNKNOWN_HOST;
+ }
+
CHECK_EQ(mSocket, -1);
mSocket = socket(AF_INET, SOCK_STREAM, 0);
@@ -57,11 +64,11 @@ status_t HTTPStream::connect(const char *server, int port) {
return UNKNOWN_ERROR;
}
- struct hostent *ent = gethostbyname(server);
- if (ent == NULL) {
- err = ERROR_UNKNOWN_HOST;
- goto exit1;
- }
+ mState = CONNECTING;
+
+ int s = mSocket;
+
+ mLock.unlock();
struct sockaddr_in addr;
addr.sin_family = AF_INET;
@@ -69,24 +76,31 @@ status_t HTTPStream::connect(const char *server, int port) {
addr.sin_addr.s_addr = *(in_addr_t *)ent->h_addr;
memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
- if (::connect(mSocket, (const struct sockaddr *)&addr, sizeof(addr)) < 0) {
- err = ERROR_CANNOT_CONNECT;
- goto exit1;
+ int res = ::connect(s, (const struct sockaddr *)&addr, sizeof(addr));
+
+ mLock.lock();
+
+ if (mState != CONNECTING) {
+ return UNKNOWN_ERROR;
}
- mState = CONNECTED;
+ if (res < 0) {
+ close(mSocket);
+ mSocket = -1;
- return OK;
+ mState = READY;
+ return UNKNOWN_ERROR;
+ }
-exit1:
- close(mSocket);
- mSocket = -1;
+ mState = CONNECTED;
- return err;
+ return OK;
}
status_t HTTPStream::disconnect() {
- if (mState != CONNECTED) {
+ Mutex::Autolock autoLock(mLock);
+
+ if (mState != CONNECTED && mState != CONNECTING) {
return ERROR_NOT_CONNECTED;
}