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:
};
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 *outfile = fopen (outname.c_str(), "w");
......@@ -135,40 +151,38 @@ ts_append (const string& inname, const string& outname, const string& dataname)
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;
p_file.clear (TSPacket::ID::awmk_file);
size_t data_pos = 0;
int pos = 12;
while (data_pos < data.size())
for (auto entry : entries)
{
p_file[pos++] = data[data_pos];
if (pos == 188)
char buf[1024];
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.clear (TSPacket::ID::awmk_data);
pos = 12;
p_file[pos++] = data[data_pos];
if (pos == 188)
{
p_file.write (outfile);
p_file.clear (TSPacket::ID::awmk_data);
pos = 12;
}
data_pos++;
}
data_pos++;
}
if (pos != 12)
{
Error err = p_file.write (outfile);
if (pos != 12)
{
Error err = p_file.write (outfile);
}
}
return Error::Code::NONE;
......
......@@ -39,6 +39,17 @@ public:
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 */
......@@ -21,18 +21,12 @@
#include <regex>
#include "utils.hh"
#include "mpegts.hh"
using std::string;
using std::regex;
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
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
TSWriter writer;
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())
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]);
}
return 0;
......
......@@ -34,7 +34,10 @@ main (int argc, char **argv)
if (argc == 5 && strcmp (argv[1], "append") == 0)
{
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)
{
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