[vlc-devel] [PATCH 5/8] dash: added downloader and bitrate to chunk
Christopher Mueller
christopher.mueller at itec.aau.at
Sun Feb 5 10:34:53 CET 2012
---
modules/stream_filter/dash/DASHDownloader.cpp | 105 +++++++++++++++++++++++++
modules/stream_filter/dash/DASHDownloader.h | 61 ++++++++++++++
modules/stream_filter/dash/Modules.am | 2 +
modules/stream_filter/dash/http/Chunk.cpp | 8 ++
modules/stream_filter/dash/http/Chunk.h | 3 +
5 files changed, 179 insertions(+), 0 deletions(-)
create mode 100644 modules/stream_filter/dash/DASHDownloader.cpp
create mode 100644 modules/stream_filter/dash/DASHDownloader.h
diff --git a/modules/stream_filter/dash/DASHDownloader.cpp b/modules/stream_filter/dash/DASHDownloader.cpp
new file mode 100644
index 0000000..be0f570
--- /dev/null
+++ b/modules/stream_filter/dash/DASHDownloader.cpp
@@ -0,0 +1,105 @@
+/*
+ * DASHDownloader.h
+ *****************************************************************************
+ * Copyright (C) 2010 - 2011 Klagenfurt University
+ *
+ * Created on: Aug 10, 2010
+ * Authors: Christopher Mueller <christopher.mueller at itec.uni-klu.ac.at>
+ * Christian Timmerer <christian.timmerer at itec.uni-klu.ac.at>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#include "DASHDownloader.h"
+
+using namespace dash;
+using namespace dash::http;
+using namespace dash::logic;
+using namespace dash::exception;
+using namespace dash::buffer;
+
+DASHDownloader::DASHDownloader (HTTPConnectionManager *conManager, IAdaptationLogic *adaptationLogic, BlockBuffer *buffer)
+{
+ this->t_sys = (thread_sys_t *) malloc(sizeof(thread_sys_t));
+ this->t_sys->conManager = conManager;
+ this->t_sys->adaptationLogic = adaptationLogic;
+ this->t_sys->buffer = buffer;
+}
+DASHDownloader::~DASHDownloader ()
+{
+ std::cout << "Downloader set eof" << std::endl;
+ this->t_sys->buffer->setEOF(true);
+ std::cout << "Downloader try to join" << std::endl;
+ vlc_join(this->dashDLThread, NULL);
+ free(this->t_sys);
+
+ std::cout << "Downloader thread joined tsys freed" << std::endl;
+}
+
+bool DASHDownloader::start ()
+{
+ if(vlc_clone(&(this->dashDLThread), download, (void*)this->t_sys, VLC_THREAD_PRIORITY_LOW))
+ return false;
+
+ return true;
+}
+void* DASHDownloader::download (void *thread_sys)
+{
+ thread_sys_t *t_sys = (thread_sys_t *) thread_sys;
+ HTTPConnectionManager *conManager = t_sys->conManager;
+ IAdaptationLogic *adaptationLogic = t_sys->adaptationLogic;
+ BlockBuffer *buffer = t_sys->buffer;
+ Chunk *currentChunk = NULL;
+ block_t *block = block_Alloc(BLOCKSIZE);
+
+ do
+ {
+ if(currentChunk == NULL)
+ {
+ try
+ {
+ currentChunk = adaptationLogic->getNextChunk();
+ }
+ catch(EOFException &e)
+ {
+ buffer->setEOF(true);
+ }
+ }
+ else
+ {
+ int ret = conManager->read(currentChunk, block->p_buffer, block->i_buffer);
+ if(ret <= 0)
+ {
+ currentChunk = NULL;
+ }
+ else
+ {
+ block_t *bufBlock = block_Alloc(ret);
+ memcpy(bufBlock->p_buffer, block->p_buffer, ret);
+ bufBlock->i_length = (ret * 8) / (currentChunk->getBitrate() / 1000);
+
+ std::cout << "Put block into buffer MilliSeconds: " << bufBlock->i_length
+ << " Bytes: " << bufBlock->i_buffer
+ << " Bitrate: " << currentChunk->getBitrate() << std::endl;
+ buffer->put(bufBlock);
+ }
+ }
+ }while(!buffer->getEOF());
+
+ std::cout << "Downloader end: " << std::endl;
+ block_Release(block);
+
+ return NULL;
+}
diff --git a/modules/stream_filter/dash/DASHDownloader.h b/modules/stream_filter/dash/DASHDownloader.h
new file mode 100644
index 0000000..11ab6d3
--- /dev/null
+++ b/modules/stream_filter/dash/DASHDownloader.h
@@ -0,0 +1,61 @@
+/*
+ * DASHDownloader.h
+ *****************************************************************************
+ * Copyright (C) 2010 - 2011 Klagenfurt University
+ *
+ * Created on: Aug 10, 2010
+ * Authors: Christopher Mueller <christopher.mueller at itec.uni-klu.ac.at>
+ * Christian Timmerer <christian.timmerer at itec.uni-klu.ac.at>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef DASHDOWNLOADER_H_
+#define DASHDOWNLOADER_H_
+
+#include "http/HTTPConnectionManager.h"
+#include "adaptationlogic/IAdaptationLogic.h"
+#include "exceptions/EOFException.h"
+#include "buffer/BlockBuffer.h"
+
+#define BLOCKSIZE 32768
+
+#include <iostream>
+
+namespace dash
+{
+ struct thread_sys_t
+ {
+ dash::http::HTTPConnectionManager *conManager;
+ logic::IAdaptationLogic *adaptationLogic;
+ buffer::BlockBuffer *buffer;
+ };
+
+ class DASHDownloader
+ {
+ public:
+ DASHDownloader (http::HTTPConnectionManager *conManager, logic::IAdaptationLogic *adaptationLogic, buffer::BlockBuffer *buffer);
+ virtual ~DASHDownloader ();
+
+ bool start ();
+ static void* download (void *);
+
+ private:
+ thread_sys_t *t_sys;
+ vlc_thread_t dashDLThread;
+ };
+}
+
+#endif /* DASHDOWNLOADER_H_ */
diff --git a/modules/stream_filter/dash/Modules.am b/modules/stream_filter/dash/Modules.am
index 00fb071..749dc52 100644
--- a/modules/stream_filter/dash/Modules.am
+++ b/modules/stream_filter/dash/Modules.am
@@ -76,6 +76,8 @@ SOURCES_stream_filter_dash = \
xml/Node.cpp \
xml/Node.h \
dash.cpp \
+ DASHDownloader.cpp \
+ DASHDownloader.h \
DASHManager.cpp \
DASHManager.h \
$(NULL)
diff --git a/modules/stream_filter/dash/http/Chunk.cpp b/modules/stream_filter/dash/http/Chunk.cpp
index 5de4e9f..445d703 100644
--- a/modules/stream_filter/dash/http/Chunk.cpp
+++ b/modules/stream_filter/dash/http/Chunk.cpp
@@ -72,3 +72,11 @@ void Chunk::setUseByteRange (bool value)
{
this->hasByteRange = value;
}
+void Chunk::setBitrate (int bitrate)
+{
+ this->bitrate = bitrate;
+}
+int Chunk::getBitrate ()
+{
+ return this->bitrate;
+}
diff --git a/modules/stream_filter/dash/http/Chunk.h b/modules/stream_filter/dash/http/Chunk.h
index c2020f8..efffa2c 100644
--- a/modules/stream_filter/dash/http/Chunk.h
+++ b/modules/stream_filter/dash/http/Chunk.h
@@ -46,6 +46,8 @@ namespace dash
void addOptionalUrl (const std::string& url);
bool useByteRange ();
void setUseByteRange (bool value);
+ void setBitrate (int bitrate);
+ int getBitrate ();
private:
std::string url;
@@ -53,6 +55,7 @@ namespace dash
int startByte;
int endByte;
bool hasByteRange;
+ int bitrate;
};
}
--
1.7.0.4
More information about the vlc-devel
mailing list