Commit c6991a4b authored by Stefan Westerfeld's avatar Stefan Westerfeld

Implement TSWriter class, make hls context embedding work.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent eb6d1e37
...@@ -113,7 +113,23 @@ public: ...@@ -113,7 +113,23 @@ public:
}; };
Error Error
ts_append (const string& inname, const string& outname, const string& dataname) TSWriter::append_file (const string& name, const string& filename)
{
vector<unsigned char> data;
FILE *datafile = fopen (filename.c_str(), "r");
ScopedFile datafile_s (datafile);
if (!datafile)
return Error ("unable to open data file");
int c;
while ((c = fgetc (datafile)) >= 0)
data.push_back (c);
entries.push_back ({name, data});
return Error::Code::NONE;
}
Error
TSWriter::process (const string& inname, const string& outname)
{ {
FILE *infile = fopen (inname.c_str(), "r"); FILE *infile = fopen (inname.c_str(), "r");
FILE *outfile = fopen (outname.c_str(), "w"); FILE *outfile = fopen (outname.c_str(), "w");
...@@ -135,40 +151,38 @@ ts_append (const string& inname, const string& outname, const string& dataname) ...@@ -135,40 +151,38 @@ ts_append (const string& inname, const string& outname, const string& dataname)
err = p.write (outfile); err = p.write (outfile);
} }
} }
vector<unsigned char> data;
FILE *datafile = fopen (dataname.c_str(), "r");
ScopedFile datafile_s (datafile);
int c;
while ((c = fgetc (datafile)) >= 0)
data.push_back (c);
char buf[1024];
sprintf (buf, "%zd", data.size());
string header = buf;
header += ":" + dataname;
header += '\0';
for (size_t i = 0; i < header.size(); i++)
data.insert (data.begin() + i, header[i]);
TSPacket p_file; for (auto entry : entries)
p_file.clear (TSPacket::ID::awmk_file);
size_t data_pos = 0;
int pos = 12;
while (data_pos < data.size())
{ {
p_file[pos++] = data[data_pos]; char buf[1024];
if (pos == 188) sprintf (buf, "%zd", entry.data.size());
string header = buf;
header += ":" + entry.name;
header += '\0';
vector<unsigned char> data = entry.data;
for (size_t i = 0; i < header.size(); i++)
data.insert (data.begin() + i, header[i]);
TSPacket p_file;
p_file.clear (TSPacket::ID::awmk_file);
size_t data_pos = 0;
int pos = 12;
while (data_pos < data.size())
{ {
p_file.write (outfile); p_file[pos++] = data[data_pos];
p_file.clear (TSPacket::ID::awmk_data); if (pos == 188)
pos = 12; {
p_file.write (outfile);
p_file.clear (TSPacket::ID::awmk_data);
pos = 12;
}
data_pos++;
} }
data_pos++;
}
if (pos != 12) if (pos != 12)
{ {
Error err = p_file.write (outfile); Error err = p_file.write (outfile);
}
} }
return Error::Code::NONE; return Error::Code::NONE;
......
...@@ -39,6 +39,17 @@ public: ...@@ -39,6 +39,17 @@ public:
const std::vector<Entry>& entries(); const std::vector<Entry>& entries();
}; };
Error ts_append (const std::string& inname, const std::string& outname, const std::string& dataname); class TSWriter
{
struct Entry
{
std::string name;
std::vector<unsigned char> data;
};
std::vector<Entry> entries;
public:
Error append_file (const std::string& name, const std::string& filename);
Error process (const std::string& in_name, const std::string& out_name);
};
#endif /* AUDIOWMARK_MPEGTS_HH */ #endif /* AUDIOWMARK_MPEGTS_HH */
...@@ -21,18 +21,12 @@ ...@@ -21,18 +21,12 @@
#include <regex> #include <regex>
#include "utils.hh" #include "utils.hh"
#include "mpegts.hh"
using std::string; using std::string;
using std::regex; using std::regex;
using std::vector; using std::vector;
class TSWriter
{
public:
void append_file (const string& name, const string& filename) {}
void process (const string& in_name, const string& out_name) {}
};
int int
hls_embed_context (const string& in_dir, const string& out_dir, const string& filename) hls_embed_context (const string& in_dir, const string& out_dir, const string& filename)
{ {
...@@ -87,9 +81,9 @@ hls_embed_context (const string& in_dir, const string& out_dir, const string& fi ...@@ -87,9 +81,9 @@ hls_embed_context (const string& in_dir, const string& out_dir, const string& fi
TSWriter writer; TSWriter writer;
if (i > 0) if (i > 0)
writer.append_file ("prev.ts", out_dir + "/" + segments[i - 1]); writer.append_file ("prev.ts", in_dir + "/" + segments[i - 1]);
if (i + 1 < segments.size()) if (i + 1 < segments.size())
writer.append_file ("next.ts", out_dir + "/" + segments[i + 1]); writer.append_file ("next.ts", in_dir + "/" + segments[i + 1]);
writer.process (in_dir + "/" + segments[i], out_dir + "/" + segments[i]); writer.process (in_dir + "/" + segments[i], out_dir + "/" + segments[i]);
} }
return 0; return 0;
......
...@@ -34,7 +34,10 @@ main (int argc, char **argv) ...@@ -34,7 +34,10 @@ main (int argc, char **argv)
if (argc == 5 && strcmp (argv[1], "append") == 0) if (argc == 5 && strcmp (argv[1], "append") == 0)
{ {
printf ("append: in=%s out=%s fn=%s\n", argv[2], argv[3], argv[4]); printf ("append: in=%s out=%s fn=%s\n", argv[2], argv[3], argv[4]);
Error err = ts_append (argv[2], argv[3], argv[4]); TSWriter writer;
writer.append_file (argv[4], argv[4]);
Error err = writer.process (argv[2], argv[3]);
if (err) if (err)
{ {
error ("ts_append: %s\n", err.message()); error ("ts_append: %s\n", err.message());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment