diff --git a/src/608_spupng.cpp b/src/608_spupng.cpp
index 250e05e8..919b0379 100644
--- a/src/608_spupng.cpp
+++ b/src/608_spupng.cpp
@@ -24,66 +24,83 @@ void
write_spumux_header(struct s_context_cc608 *context)
{
if (0 == context->spupng_data)
- context->spupng_data = new SpuPng(context);
- ((SpuPng*)context->spupng_data)->writeHeader();
+ context->spupng_data = spunpg_init(context);
+
+ spupng_write_header((struct spupng_t*)context->spupng_data);
}
void
write_spumux_footer(struct s_context_cc608 *context)
{
- if (0 != context->spupng_data)
+ if (0 != context->spupng_data)
{
- ((SpuPng*)context->spupng_data)->writeFooter();
- delete (SpuPng*)context->spupng_data;
- context->spupng_data = 0;
- context->out->fh = -1;
+ struct spupng_t *sp = (struct spupng_t *) context->spupng_data;
+
+ spupng_write_footer(sp);
+ spunpg_free(sp);
+
+ context->spupng_data = 0;
+ context->out->fh = -1;
}
}
int
write_cc_buffer_as_spupng(struct eia608_screen *data, struct s_context_cc608 *context)
{
- if (0 != context->spupng_data)
+ if (0 != context->spupng_data)
{
- return ((SpuPng*)context->spupng_data)->writeCCBuffer(data, context);
+ struct spupng_t *sp = (struct spupng_t *) context->spupng_data;
+ return spupng_write_ccbuffer(sp, data, context);
}
return 0;
}
static int initialized = 0;
-SpuPng::SpuPng(struct s_context_cc608 *context)
+struct spupng_t *spunpg_init(struct s_context_cc608 *context)
{
+ struct spupng_t *sp = (struct spupng_t *) malloc(sizeof(struct spupng_t));
+ if (NULL == sp)
+ fatal(EXIT_NOT_ENOUGH_MEMORY, "Memory allocation failed");
+
if (!initialized)
{
initialized = 1;
- initFont();
+ spupng_init_font();
}
- if ((fpxml = fdopen(context->out->fh, "w")) == NULL)
+ if ((sp->fpxml = fdopen(context->out->fh, "w")) == NULL)
{
- fatal(EXIT_FILE_CREATION_FAILED, "Cannot open %s: %s\n", context->out->filename, strerror(errno));
+ fatal(EXIT_FILE_CREATION_FAILED, "Cannot open %s: %s\n",
+ context->out->filename, strerror(errno));
}
- dirname = new char [strlen(context->out->filename) + 3];
- strcpy(dirname, context->out->filename);
- char* p = strrchr(dirname, '.');
- if (0 == p)
- p = dirname + strlen(dirname);
+ sp->dirname = (char *) malloc(
+ sizeof(char) * (strlen(context->out->filename) + 3));
+ if (NULL == sp->dirname)
+ fatal(EXIT_NOT_ENOUGH_MEMORY, "Memory allocation failed");
+
+ strcpy(sp->dirname, context->out->filename);
+ char* p = strrchr(sp->dirname, '.');
+ if (NULL == p)
+ p = sp->dirname + strlen(sp->dirname);
*p = '\0';
- strcat(dirname, ".d");
- if (mkdir(dirname, 0777) != 0)
+ strcat(sp->dirname, ".d");
+ if (0 != mkdir(sp->dirname, 0777))
{
if (errno != EEXIST)
{
- fatal(EXIT_FILE_CREATION_FAILED, "Cannot create %s: %s\n", dirname, strerror(errno));
+ fatal(EXIT_FILE_CREATION_FAILED, "Cannot create %s: %s\n",
+ sp->dirname, strerror(errno));
}
// If dirname isn't a directory or if we don't have write permission,
- // the first attempt to create a .png file will fail and we'll exit.
+ // the first attempt to create a .png file will fail and we'll XXxit.
}
// enough to append /subNNNN.png
- pngfile = new char [ strlen(dirname) + 13 ];
- fileIndex = 0;
+ sp->pngfile = (char *) malloc(sizeof(char) * (strlen(sp->dirname) + 13));
+ if (NULL == sp->pngfile)
+ fatal(EXIT_NOT_ENOUGH_MEMORY, "Memory allocation failed");
+ sp->fileIndex = 0;
// For NTSC closed captions and 720x480 DVD subtitle resolution:
// Each character is 16x26.
@@ -92,35 +109,39 @@ SpuPng::SpuPng(struct s_context_cc608 *context)
// To center image in 720x480 DVD screen, offset image by 88 and 45
// Need to keep yOffset even to prevent flicker on interlaced displays
// Would need to do something different for PAL format and teletext.
- xOffset = 88;
- yOffset = 46;
+ sp->xOffset = 88;
+ sp->yOffset = 46;
+
+ return sp;
}
-SpuPng::~SpuPng()
+void
+spunpg_free(struct spupng_t *sp)
{
- delete [] dirname;
- delete [] pngfile;
+ free(sp->dirname);
+ free(sp->pngfile);
+ free(sp);
}
-
-void
-SpuPng::writeHeader()
+void
+spupng_write_header(struct spupng_t *sp)
{
- fprintf(fpxml, "\n\n");
+ fprintf(sp->fpxml, "\n\n");
if (num_input_files > 0)
- fprintf(fpxml, "\n", inputfile[0]);
+ fprintf(sp->fpxml, "\n", inputfile[0]);
}
-void
-SpuPng::writeFooter()
+void
+spupng_write_footer(struct spupng_t *sp)
{
- fprintf(fpxml, "\n\n");
- fflush(fpxml);
- fclose(fpxml);
+ fprintf(sp->fpxml, "\n\n");
+ fflush(sp->fpxml);
+ fclose(sp->fpxml);
}
int
-SpuPng::writeCCBuffer(struct eia608_screen* data, struct s_context_cc608 *context)
+spupng_write_ccbuffer(struct spupng_t *sp, struct eia608_screen* data,
+ struct s_context_cc608 *context)
{
LLONG ms_start = context->current_visible_start_ms + subs_delay;
if (ms_start < 0)
@@ -145,30 +166,32 @@ SpuPng::writeCCBuffer(struct eia608_screen* data, struct s_context_cc608 *contex
return 0;
}
- LLONG ms_end=get_visible_end()+subs_delay;
+ LLONG ms_end = get_visible_end() + subs_delay;
- sprintf(pngfile, "%s/sub%04d.png", dirname, fileIndex++);
- if ((fppng = fopen(pngfile, "wb")) == NULL)
+ sprintf(sp->pngfile, "%s/sub%04d.png", sp->dirname, sp->fileIndex++);
+ if ((sp->fppng = fopen(sp->pngfile, "wb")) == NULL)
{
- fatal(EXIT_FILE_CREATION_FAILED, "Cannot open %s: %s\n", pngfile, strerror(errno));
+ fatal(EXIT_FILE_CREATION_FAILED, "Cannot open %s: %s\n",
+ sp->pngfile, strerror(errno));
}
- if (!exportPNG(data))
+ if (!spupng_export_png(sp, data))
{
- fatal(EXIT_FILE_CREATION_FAILED, "Cannot write %s: %s\n", pngfile, strerror(errno));
+ fatal(EXIT_FILE_CREATION_FAILED, "Cannot write %s: %s\n",
+ sp->pngfile, strerror(errno));
}
- fclose(fppng);
+ fclose(sp->fppng);
- fprintf(fpxml, "fpxml, "fpxml, " end=\"%.3f\"", ((double)ms_end) / 1000);
dbg_print(CCX_DMT_608, " end=\"%.3f\"", ((double)ms_end) / 1000);
- fprintf(fpxml, " image=\"%s\"", pngfile);
- dbg_print(CCX_DMT_608, " image=\"%s\"", pngfile);
- fprintf(fpxml, " xoffset=\"%d\"", xOffset);
- dbg_print(CCX_DMT_608, " xoffset=\"%d\"", xOffset);
- fprintf(fpxml, " yoffset=\"%d\"", yOffset);
- dbg_print(CCX_DMT_608, " yoffset=\"%d\"", yOffset);
- fprintf(fpxml, ">\n\n");
+ fprintf(sp->fpxml, "-->\n");
dbg_print(CCX_DMT_608, "-->\n");
- fflush(fpxml);
+ fflush(sp->fpxml);
return 1;
}
@@ -210,8 +233,8 @@ SpuPng::writeCCBuffer(struct eia608_screen* data, struct s_context_cc608 *contex
// Begin copy from http://zapping.cvs.sourceforge.net/viewvc/zapping/vbi/src/exp-gfx.c?view=markup&pathrev=zvbi-0-2-33
//
-void
-SpuPng::initFont(void)
+void
+spupng_init_font()
{
uint8_t *t, *p;
int i, j;
@@ -230,7 +253,7 @@ SpuPng::initFont(void)
free (t);
#endif
if (!(t = (uint8_t*)malloc(ccfont2_width * ccfont2_height / 8)))
- exit(EXIT_FAILURE);
+ fatal(EXIT_NOT_ENOUGH_MEMORY, "Memory allocation failed");
for (p = t, i = 0; i < CCH; i++)
for (j = 0; j < ccfont2_height; p += ccfont2_width / 8, j += CCH)
@@ -480,20 +503,19 @@ static png_byte alpha[10] =
0
};
-int
-SpuPng::writePNG(struct eia608_screen* data,
- png_structp png_ptr, png_infop info_ptr,
- png_bytep image,
- png_bytep* row_pointer,
- unsigned int ww,
- unsigned int wh)
+int
+spupng_write_png(struct spupng_t *sp, struct eia608_screen* data,
+ png_structp png_ptr, png_infop info_ptr,
+ png_bytep image,
+ png_bytep* row_pointer,
+ unsigned int ww, unsigned int wh)
{
unsigned int i;
if (setjmp(png_jmpbuf(png_ptr)))
return 0;
- png_init_io (png_ptr, fppng);
+ png_init_io (png_ptr, sp->fppng);
png_set_IHDR (png_ptr,
info_ptr,
@@ -522,8 +544,8 @@ SpuPng::writePNG(struct eia608_screen* data,
return 1;
}
-int
-SpuPng::exportPNG(struct eia608_screen* data)
+int
+spupng_export_png(struct spupng_t *sp, struct eia608_screen* data)
{
png_structp png_ptr;
png_infop info_ptr;
@@ -575,7 +597,7 @@ SpuPng::exportPNG(struct eia608_screen* data)
goto unknown_error;
}
- if (!writePNG (data, png_ptr, info_ptr, image, row_pointer, ww, wh)) {
+ if (!spupng_write_png (sp, data, png_ptr, info_ptr, image, row_pointer, ww, wh)) {
png_destroy_write_struct (&png_ptr, &info_ptr);
goto write_error;
}
diff --git a/src/608_spupng.h b/src/608_spupng.h
index 92be8011..5b79d129 100644
--- a/src/608_spupng.h
+++ b/src/608_spupng.h
@@ -3,34 +3,35 @@
#include "png.h"
#include "ccextractor.h"
-class SpuPng
+struct spupng_t
{
- public:
- SpuPng(struct s_context_cc608 *context);
- ~SpuPng();
-
- void writeHeader();
- void writeFooter();
-
- int writeCCBuffer(struct eia608_screen* data, struct s_context_cc608 *context);
-
- private:
- static void initFont(void);
- int writePNG(struct eia608_screen* data,
- png_structp png_ptr, png_infop info_ptr,
- png_bytep image,
- png_bytep* row_pointer,
- unsigned int ww,
- unsigned int wh);
- int exportPNG(struct eia608_screen* data);
-
- FILE* fpxml;
- FILE* fppng;
- char* dirname;
- char* pngfile;
- int fileIndex;
- int xOffset;
- int yOffset;
+ FILE* fpxml;
+ FILE* fppng;
+ char* dirname;
+ char* pngfile;
+ int fileIndex;
+ int xOffset;
+ int yOffset;
};
+struct spupng_t *spunpg_init(struct s_context_cc608 *context);
+void spunpg_free(struct spupng_t *spupng);
+
+void spupng_write_header(struct spupng_t *spupng);
+void spupng_write_footer(struct spupng_t *spupng);
+
+int spupng_write_ccbuffer(struct spupng_t *spupng, struct eia608_screen* data,
+ struct s_context_cc608 *context);
+
+void spupng_init_font();
+
+int spupng_write_png(struct spupng_t *spupng,
+ struct eia608_screen* data,
+ png_structp png_ptr, png_infop info_ptr,
+ png_bytep image,
+ png_bytep* row_pointer,
+ unsigned int ww, unsigned int wh);
+
+int spupng_export_png(struct spupng_t *spupng, struct eia608_screen* data);
+
#endif /* __608_SPUPNG_H__ */