Skip to content

Commit

Permalink
tidy: Convert subtitles array to a std::vector.
Browse files Browse the repository at this point in the history
  • Loading branch information
linuxdude42 committed Aug 28, 2020
1 parent cdda720 commit d307b05
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 91 deletions.
13 changes: 5 additions & 8 deletions mythtv/libs/libmythtv/captions/textsubtitleparser.cpp
Expand Up @@ -358,8 +358,7 @@ void TextSubtitleParser::LoadSubtitles(const QString &fileName,
sub_data.rbuffer_text = ba.data();
sub_data.rbuffer_len = ba.size();

subtitle_t *loaded_subs = sub_read_file(&sub_data);
if (!loaded_subs)
if (!sub_read_file(&sub_data))
{
// Don't delete[] sub_data.rbuffer_text; because the
// QByteArray destructor will clean up.
Expand All @@ -379,20 +378,19 @@ void TextSubtitleParser::LoadSubtitles(const QString &fileName,
if (textCodec)
dec.reset(textCodec->makeDecoder());

for (int sub_i = 0; sub_i < sub_data.num; ++sub_i)
for (const auto& sub : sub_data.subtitles)
{
const subtitle_t *sub = &loaded_subs[sub_i];
text_subtitle_t newsub(sub->start, sub->end);
text_subtitle_t newsub(sub.start, sub.end);

if (!target.IsFrameBasedTiming())
{
newsub.m_start *= 10; // convert from csec to msec
newsub.m_end *= 10;
}

for (size_t line = 0; line < sub->text.size(); ++line)
for (const auto & line : sub.text)
{
const char *subLine = sub->text[line].c_str();
const char *subLine = line.c_str();
QString str;
if (textCodec)
str = dec->toUnicode(subLine, strlen(subLine));
Expand All @@ -405,7 +403,6 @@ void TextSubtitleParser::LoadSubtitles(const QString &fileName,

// textCodec object is managed by Qt, do not delete...

free(loaded_subs);
// Don't delete[] sub_data.rbuffer_text; because the QByteArray
// destructor will clean up.

Expand Down
76 changes: 21 additions & 55 deletions mythtv/libs/libmythtv/captions/xine_demux_sputext.cpp
Expand Up @@ -236,8 +236,6 @@ static subtitle_t *sub_read_line_microdvd(demux_sputext_t *demuxstr, subtitle_t
char line[LINE_LEN + 1];
char line2[LINE_LEN + 1];

memset (current, 0, sizeof(subtitle_t));

current->end=-1;
do {
if (!read_line_from_input (demuxstr, line, LINE_LEN)) return nullptr;
Expand All @@ -262,8 +260,6 @@ static subtitle_t *sub_read_line_subviewer(demux_sputext_t *demuxstr, subtitle_t
char line[LINE_LEN + 1];
int a1=0,a2=0,a3=0,a4=0,b1=0,b2=0,b3=0,b4=0; // NOLINT(readability-isolate-declaration)

memset (current, 0, sizeof(subtitle_t));

while (true) {
if (!read_line_from_input(demuxstr, line, LINE_LEN)) return nullptr;
if (sscanf (line, "%d:%d:%d.%d,%d:%d:%d.%d",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4) < 8) {
Expand Down Expand Up @@ -297,7 +293,6 @@ static subtitle_t *sub_read_line_subrip(demux_sputext_t *demuxstr,subtitle_t *cu
int a1=0,a2=0,a3=0,a4=0,b1=0,b2=0,b3=0,b4=0; // NOLINT(readability-isolate-declaration)
int i = 0;

memset(current,0,sizeof(subtitle_t));
do {
if(!read_line_from_input(demuxstr,line,LINE_LEN))
return nullptr;
Expand Down Expand Up @@ -376,8 +371,6 @@ static subtitle_t *sub_read_line_vplayer(demux_sputext_t *demuxstr,subtitle_t *c
char line[LINE_LEN + 1];
int a1=0,a2=0,a3=0,b1=0,b2=0,b3=0; // NOLINT(readability-isolate-declaration)

memset (current, 0, sizeof(subtitle_t));

while (current->text.empty()) {
if( demuxstr->next_line[0] == '\0' ) { /* if the buffer is empty.... */
if( !read_line_from_input(demuxstr, line, LINE_LEN) ) return nullptr;
Expand Down Expand Up @@ -430,8 +423,6 @@ static subtitle_t *sub_read_line_rt(demux_sputext_t *demuxstr,subtitle_t *curren
int a1=0,a2=0,a3=0,a4=0,b1=0,b2=0,b3=0,b4=0; // NOLINT(readability-isolate-declaration)
int plen = 0;

memset (current, 0, sizeof(subtitle_t));

while (current->text.empty()) {
if (!read_line_from_input(demuxstr, line, LINE_LEN)) return nullptr;
/*
Expand Down Expand Up @@ -543,8 +534,6 @@ static subtitle_t *sub_read_line_pjs (demux_sputext_t *demuxstr, subtitle_t *cur
char *s = nullptr;
char *d = nullptr;

memset (current, 0, sizeof(subtitle_t));

if (!read_line_from_input(demuxstr, line, LINE_LEN))
return nullptr;
for (s = line; *s && isspace(*s); s++);
Expand Down Expand Up @@ -623,8 +612,6 @@ static subtitle_t *sub_read_line_mpsub (demux_sputext_t *demuxstr, subtitle_t *c
static subtitle_t *sub_read_line_aqt (demux_sputext_t *demuxstr, subtitle_t *current) {
char line[LINE_LEN + 1];

memset (current, 0, sizeof(subtitle_t));

while (true) {
/* try to locate next subtitle_t */
if (!read_line_from_input(demuxstr, line, LINE_LEN))
Expand Down Expand Up @@ -665,7 +652,6 @@ static subtitle_t *sub_read_line_jacobsub(demux_sputext_t *demuxstr, subtitle_t
static unsigned s_jacoTimeRes = 30;
static int s_jacoShift = 0;

memset(current, 0, sizeof(subtitle_t));
memset(line1, 0, LINE_LEN+1);
memset(line2, 0, LINE_LEN+1);
memset(directive, 0, LINE_LEN+1);
Expand Down Expand Up @@ -905,8 +891,6 @@ static subtitle_t *sub_read_line_subrip09 (demux_sputext_t *demuxstr, subtitle_t
int m = 0;
int s = 0;

memset (current, 0, sizeof(subtitle_t));

do {
if (!read_line_from_input (demuxstr, line, LINE_LEN)) return nullptr;
} while (sscanf (line, "[%d:%d:%d]", &h, &m, &s) != 3);
Expand Down Expand Up @@ -935,7 +919,6 @@ static subtitle_t *sub_read_line_mpl2(demux_sputext_t *demuxstr, subtitle_t *cur
char line[LINE_LEN+1];
char line2[LINE_LEN+1];

memset (current, 0, sizeof(subtitle_t));
do {
if (!read_line_from_input (demuxstr, line, LINE_LEN)) return nullptr;
} while ((sscanf (line,
Expand Down Expand Up @@ -1055,12 +1038,11 @@ static int sub_autodetect (demux_sputext_t *demuxstr) {
return FORMAT_UNKNOWN; /* too many bad lines */
}

subtitle_t *sub_read_file (demux_sputext_t *demuxstr) {

// These functions all return either 1) nullptr, 2) (subtitle_t*)ERR,
// or 3) a pointer to the dest parameter.
subtitle_t * (*func[])(demux_sputext_t *demuxstr,subtitle_t *dest)=
{
// These functions all return either 1) nullptr, 2) (subtitle_t*)ERR,
// or 3) a pointer to the dest parameter.
using read_func_ptr = subtitle_t* (*)(demux_sputext_t *demuxstr,subtitle_t *dest);
const std::array<read_func_ptr, 14> read_func
{
sub_read_line_microdvd,
sub_read_line_subrip,
sub_read_line_subviewer,
Expand All @@ -1074,16 +1056,18 @@ subtitle_t *sub_read_file (demux_sputext_t *demuxstr) {
sub_read_line_jacobsub,
sub_read_line_subviewer2,
sub_read_line_subrip09,
sub_read_line_mpl2,
};
sub_read_line_mpl2
};

bool sub_read_file (demux_sputext_t *demuxstr) {

/* Rewind (sub_autodetect() needs to read input from the beginning) */
demuxstr->rbuffer_cur = 0;
demuxstr->buflen = 0;

demuxstr->format=sub_autodetect (demuxstr);
if (demuxstr->format==FORMAT_UNKNOWN) {
return nullptr;
return false;
}

/*printf("Detected subtitle file format: %d\n", demuxstr->format);*/
Expand All @@ -1093,60 +1077,43 @@ subtitle_t *sub_read_file (demux_sputext_t *demuxstr) {
demuxstr->buflen = 0;

demuxstr->num=0;
int n_max=32;
auto *first = (subtitle_t *) malloc(n_max*sizeof(subtitle_t));
if(!first) return nullptr;
memset(first, 0, n_max*sizeof(subtitle_t));
int timeout = MAX_TIMEOUT;

if (demuxstr->uses_time) timeout *= 100;
else timeout *= 10;

while(true) {
if(demuxstr->num>=n_max){
int old_size = n_max*sizeof(subtitle_t);
n_max+=16;
auto *new_first=(subtitle_t *)realloc(first,n_max*sizeof(subtitle_t));
if (new_first == nullptr) {
// clang-tidy-11 says this is fine. ct-9 produces a weird
// warning here. NOLINTNEXTLINE(clang-analyzer-unix.Malloc)
free(first);
return nullptr;
}
// Clear only the new space at the end of the array.
memset((char*)new_first + old_size, 0, 16*sizeof(subtitle_t));
first = new_first;
}

subtitle_t *sub = func[demuxstr->format] (demuxstr, &first[demuxstr->num]);
subtitle_t dummy {};
subtitle_t *sub = read_func[demuxstr->format] (demuxstr, &dummy);
if (!sub) {
break; /* EOF */
}

if (sub==ERR)
++demuxstr->errs;
else {
if (demuxstr->num > 0 && first[demuxstr->num-1].end == -1) {
demuxstr->subtitles.push_back(*sub);
if (demuxstr->num > 0 && demuxstr->subtitles[demuxstr->num-1].end == -1) {
/* end time not defined in the subtitle */
if (timeout > 0) {
/* timeout */
if (timeout > sub->start - first[demuxstr->num-1].start) {
first[demuxstr->num-1].end = sub->start;
if (timeout > sub->start - demuxstr->subtitles[demuxstr->num-1].start) {
demuxstr->subtitles[demuxstr->num-1].end = sub->start;
} else
first[demuxstr->num-1].end = first[demuxstr->num-1].start + timeout;
demuxstr->subtitles[demuxstr->num-1].end = demuxstr->subtitles[demuxstr->num-1].start + timeout;
} else {
/* no timeout */
first[demuxstr->num-1].end = sub->start;
demuxstr->subtitles[demuxstr->num-1].end = sub->start;
}
}
++demuxstr->num; /* Error vs. Valid */
}
}
/* timeout of last subtitle */
if (demuxstr->num > 0 && first[demuxstr->num-1].end == -1)
if (demuxstr->num > 0 && demuxstr->subtitles[demuxstr->num-1].end == -1)
{
if (timeout > 0) {
first[demuxstr->num-1].end = first[demuxstr->num-1].start + timeout;
demuxstr->subtitles[demuxstr->num-1].end = demuxstr->subtitles[demuxstr->num-1].start + timeout;
}
}

Expand All @@ -1165,8 +1132,7 @@ subtitle_t *sub_read_file (demux_sputext_t *demuxstr) {
}
#endif

demuxstr->subtitles = first;
// No memory leak of 'sub' here. 'Sub' always points to an element in 'first'.
// NOLINT(clang-analyzer-unix.Malloc)
return first;
return true;
}
4 changes: 2 additions & 2 deletions mythtv/libs/libmythtv/captions/xine_demux_sputext.h
Expand Up @@ -49,7 +49,7 @@ struct demux_sputext_t {

int uses_time;
int errs;
subtitle_t *subtitles;
std::vector<subtitle_t> subtitles;
int num; /* number of subtitle structs */
int cur; /* current subtitle */
int format; /* constants see below */
Expand All @@ -58,6 +58,6 @@ struct demux_sputext_t {
};


subtitle_t *sub_read_file (demux_sputext_t *demuxstr);
bool sub_read_file (demux_sputext_t *demuxstr);

#endif

0 comments on commit d307b05

Please sign in to comment.