#include <map>
#include "metacube.h"
+#include "mutexlock.h"
#include "input.h"
#include "server.h"
extern Server *servers;
-Input::Input(const string &stream_id)
+Input::Input(const string &stream_id, const string &url)
: stream_id(stream_id),
+ url(url),
has_metacube_header(false)
{
}
-void Input::run(const string &url)
+void Input::run()
+{
+ should_stop = false;
+
+ // Joinable is already the default, but it's good to be certain.
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+ pthread_create(&worker_thread, &attr, Input::do_work_thunk, this);
+}
+
+void Input::stop()
+{
+ should_stop = true;
+
+ if (pthread_join(worker_thread, NULL) == -1) {
+ perror("pthread_join");
+ exit(1);
+ }
+}
+
+void *Input::do_work_thunk(void *arg)
+{
+ Input *input = static_cast<Input *>(arg);
+ input->do_work();
+ return NULL;
+}
+
+void Input::do_work()
{
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
size_t Input::curl_callback_thunk(char *ptr, size_t size, size_t nmemb, void *userdata)
{
Input *input = static_cast<Input *>(userdata);
+ if (input->should_stop) {
+ return 0;
+ }
+
size_t bytes = size * nmemb;
input->curl_callback(ptr, bytes);
return bytes;