#ifndef _HTTPINPUT_H
#define _HTTPINPUT_H 1
-#include <pthread.h>
#include <stddef.h>
+#include <sys/types.h>
+#include <mutex>
#include <string>
#include <vector>
#include "input.h"
#include "metacube2.h"
+#include "stream.h"
class InputProto;
+// Despite the name, covers input over both HTTP and pipes, both typically
+// wrapped in Metacube.
class HTTPInput : public Input {
public:
HTTPInput(const std::string &url, Input::Encoding encoding);
// Open a socket that connects to the given host and port. Does DNS resolving.
int lookup_and_connect(const std::string &host, const std::string &port);
+ // Open a child process with the given command line (given to /bin/sh).
+ // Returns a pipe to its standard output.
+ int open_child_process(const std::string &cmdline);
+
// Parses a HTTP response. Returns false if it not a 200.
bool parse_response(const std::string &response);
// The socket we are downloading on (or -1).
int sock = -1;
+ // pid of the child process (or -1).
+ pid_t child_pid = -1;
+
// Mutex protecting <stats>.
- mutable pthread_mutex_t stats_mutex;
+ mutable std::mutex stats_mutex;
// The current statistics for this connection. Protected by <stats_mutex>.
InputStats stats;
// Last time we made a connection with logging enabled.
// (Initially at some point before the epoch.)
timespec last_verbose_connection { -3600, 0 };
+
+ // If we've received a Metacube2 PTS metadata block, it belongs to the
+ // next regular block we receive, and is stored here in the meantime.
+ // If we haven't received one yet (or we've already received the
+ // corresponding data block), this is empty, ie., timebase_num == 0.
+ RationalPTS next_block_pts;
};
#endif // !defined(_HTTPINPUT_H)