forked from theluyuan/avs2bdnxml
removed object files.
deleted old README. added parameter "-F" to mark all subtitles as forced. added usage to README file.
This commit is contained in:
parent
503e803d47
commit
6d4f93e4ab
67
README
67
README
@ -1,67 +0,0 @@
|
|||||||
AVS to BluRay SUP/PGS and BDN XML
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
This program can be used to transform AviSynth scripts, which produce RGBA
|
|
||||||
output, to BDN XML+PNG format. This in turn can be transformed into a SUP file,
|
|
||||||
which can be used to master a BluRay disc with subtitles.
|
|
||||||
|
|
||||||
Usage instructions:
|
|
||||||
|
|
||||||
0. If you want to build it:
|
|
||||||
i586-mingw32msvc-gcc avs2bdnxml.c -o avs2bdnxml.exe -lpng -lz -lvfw32 \
|
|
||||||
-Llib/ -O3 -Iinc/
|
|
||||||
|
|
||||||
1. Prepare subtitles. You can either produce subtitles in a normal format like
|
|
||||||
SRT or ASS/SSA, or produce an RGBA video beforehand.
|
|
||||||
|
|
||||||
2. Create an AviSynth script. If you made a regular subtitle file, you can use
|
|
||||||
something like this:
|
|
||||||
|
|
||||||
video=AviSource("video.avi")
|
|
||||||
# This requires at least VSFilter 2.39
|
|
||||||
MaskSub("subtitles.ext",video.width,video.height,
|
|
||||||
video.framerate,video.framecount)
|
|
||||||
|
|
||||||
If you created an RGBA video, do something like this instead:
|
|
||||||
|
|
||||||
AviSource("subtitles_RGBA.avi")
|
|
||||||
FlipVertical()
|
|
||||||
|
|
||||||
3. Run the program:
|
|
||||||
avs2bdnxml input.avs Undefined und 1080p 23.976 output.xml
|
|
||||||
|
|
||||||
4. For some programs, you have to convert the PNG files to 8bit RGBA palette.
|
|
||||||
This doesn't apply to BDSupEdit. You can do it with a tool like pngquant or
|
|
||||||
pngnq.
|
|
||||||
|
|
||||||
pngquant: http://www.libpng.org/pub/png/apps/pngquant.html
|
|
||||||
pngnq: http://pngnq.sourceforge.net/
|
|
||||||
|
|
||||||
5. You get a BDN XML file in the following format:
|
|
||||||
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<BDN Version="0.93" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:noNamespaceSchemaLocation="BD-03-006-0093b BDN File Format.xsd">
|
|
||||||
<Description>
|
|
||||||
<Name Title="Undefined" Content=""/>
|
|
||||||
<Language Code="und"/>
|
|
||||||
<Format VideoFormat="[ 480i / 480p / 576i / 720p / 1080i /1080p ]" FrameRate="[ 23.976 / 24 / 25 / 29.97 / 50 / 59.94 ]" DropFrame="false"/>
|
|
||||||
<Events LastEventOutTC="00:00:00:00" FirstEventInTC="00:00:00:00" ContentInTC="00:00:00:00"
|
|
||||||
ContentOutTC="00:00:00:00" NumberofEvents="[ number of encoded frames ]" Type="Graphic"/>
|
|
||||||
</Description>
|
|
||||||
<Events>
|
|
||||||
<Event Forced="[ False / True ]" InTC="00:00:00:00" OutTC="00:00:00:00">
|
|
||||||
<Graphic Width="0" Height="0" X="0" Y="0">000000.png</Graphic>
|
|
||||||
</Event>
|
|
||||||
</Events>
|
|
||||||
</BDN>
|
|
||||||
|
|
||||||
6. Use a program like BDSupEdit or BDSup2Sub to convert the BDN XML
|
|
||||||
to a BD-SUP file. The rest is left as an exercise for the reader.
|
|
||||||
|
|
||||||
BDSupEdit: http://forum.doom9.org/showthread.php?t=146157
|
|
||||||
BDSup2Sub: http://forum.doom9.org/showthread.php?t=145277
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- http://ps-auxw.de/avs2bdnxml/
|
|
38
README.md
38
README.md
@ -66,6 +66,44 @@ avs2bdnxml -t Undefined -l und -v 1080p -f 23.976 -a1 -p1 -b0 -m3 -u0 -e0 -n0 -z
|
|||||||
|
|
||||||
**Don't use BDSupEdit or BDSup2Sub if you enabled -b for splitting images in multiple parts!**
|
**Don't use BDSupEdit or BDSup2Sub if you enabled -b for splitting images in multiple parts!**
|
||||||
|
|
||||||
|
Commandline Parameters
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
Usage: avs2bdnxml [options] -o output input
|
||||||
|
|
||||||
|
Input has to be an AviSynth script with RGBA as output colorspace
|
||||||
|
|
||||||
|
-o, --output <string> Output file in BDN XML format
|
||||||
|
For SUP/PGS output, use a .sup extension
|
||||||
|
-j, --seek <integer> Start processing at this frame, first is 0
|
||||||
|
-c, --count <integer> Number of input frames to process
|
||||||
|
-t, --trackname <string> Name of track, like: Undefined
|
||||||
|
-l, --language <string> Language code, like: und
|
||||||
|
-v, --video-format <string> Either of: 480i, 480p, 576i,
|
||||||
|
720p, 1080i, 1080p
|
||||||
|
-f, --fps <float> Either of: 23.976, 24, 25, 29.97, 50, 59.94
|
||||||
|
-x, --x-offset <integer> X offset, for use with partial frames.
|
||||||
|
-y, --y-offset <integer> Y offset, for use with partial frames.
|
||||||
|
-d, --t-offset <string> Offset timecodes by this many frames or
|
||||||
|
given non-drop timecode (HH:MM:SS:FF).
|
||||||
|
-s, --split-at <integer> Split events longer than this, in frames.
|
||||||
|
Disabled when 0, which is the default.
|
||||||
|
-m, --min-split <integer> Minimum length of line segment after split.
|
||||||
|
-e, --even-y <integer> Enforce even Y coordinates. [on=1, off=0]
|
||||||
|
-a, --autocrop <integer> Automatically crop output. [on=1, off=0]
|
||||||
|
-p, --palette <integer> Output 8bit palette PNG. [on=1, off=0]
|
||||||
|
-n, --null-xml <integer> Allow output of empty XML files. [on=1, off=0]
|
||||||
|
-z, --stricter <integer> Stricter checks in the SUP writer. May lead to
|
||||||
|
less optimized buffer use, but might raise
|
||||||
|
compatibility. [on=1, off=0]
|
||||||
|
-u, --ugly <integer> Allow splitting images in ugly ways.
|
||||||
|
Might improve buffer problems, but is ugly.
|
||||||
|
[on=1, off=0]
|
||||||
|
-b, --buffer-opt <integer> Optimize PG buffer size by image
|
||||||
|
splitting. [on=1, off=0]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Detail informations on [doom9](http://forum.doom9.org/showthread.php?t=146493)
|
Detail informations on [doom9](http://forum.doom9.org/showthread.php?t=146493)
|
||||||
|
|
||||||
|
BIN
auto_split.o
BIN
auto_split.o
Binary file not shown.
47
avs2bdnxml.c
47
avs2bdnxml.c
@ -155,6 +155,7 @@
|
|||||||
#include "auto_split.h"
|
#include "auto_split.h"
|
||||||
#include "palletize.h"
|
#include "palletize.h"
|
||||||
#include "sup.h"
|
#include "sup.h"
|
||||||
|
#include "ass.h"
|
||||||
#include "abstract_lists.h"
|
#include "abstract_lists.h"
|
||||||
|
|
||||||
/* AVIS input code taken from muxers.c from the x264 project (GPLv2 or later).
|
/* AVIS input code taken from muxers.c from the x264 project (GPLv2 or later).
|
||||||
@ -632,7 +633,8 @@ void print_usage ()
|
|||||||
" Might improve buffer problems, but is ugly.\n"
|
" Might improve buffer problems, but is ugly.\n"
|
||||||
" [on=1, off=0]\n"
|
" [on=1, off=0]\n"
|
||||||
" -b, --buffer-opt <integer> Optimize PG buffer size by image\n"
|
" -b, --buffer-opt <integer> Optimize PG buffer size by image\n"
|
||||||
" splitting. [on=1, off=0]\n\n"
|
" splitting. [on=1, off=0]\n"
|
||||||
|
" -F, --forced <integer> mark all subtitles as forced [on=1, off=0]\n\n"
|
||||||
"Example:\n"
|
"Example:\n"
|
||||||
" avs2bdnxml -t Undefined -l und -v 1080p -f 23.976 -a1 -p1 -b0 -m3 \\\n"
|
" avs2bdnxml -t Undefined -l und -v 1080p -f 23.976 -a1 -p1 -b0 -m3 \\\n"
|
||||||
" -u0 -e0 -n0 -z0 -o output.xml input.avs\n"
|
" -u0 -e0 -n0 -z0 -o output.xml input.avs\n"
|
||||||
@ -714,12 +716,13 @@ typedef struct event_s
|
|||||||
int start_frame;
|
int start_frame;
|
||||||
int end_frame;
|
int end_frame;
|
||||||
int graphics;
|
int graphics;
|
||||||
|
int forced;
|
||||||
crop_t c[2];
|
crop_t c[2];
|
||||||
} event_t;
|
} event_t;
|
||||||
|
|
||||||
STATIC_LIST(event, event_t)
|
STATIC_LIST(event, event_t)
|
||||||
|
|
||||||
void add_event_xml_real (event_list_t *events, int image, int start, int end, int graphics, crop_t *crops)
|
void add_event_xml_real (event_list_t *events, int image, int start, int end, int graphics, crop_t *crops, int forced)
|
||||||
{
|
{
|
||||||
event_t *new = calloc(1, sizeof(event_t));
|
event_t *new = calloc(1, sizeof(event_t));
|
||||||
new->image_number = image;
|
new->image_number = image;
|
||||||
@ -728,45 +731,46 @@ void add_event_xml_real (event_list_t *events, int image, int start, int end, in
|
|||||||
new->graphics = graphics;
|
new->graphics = graphics;
|
||||||
new->c[0] = crops[0];
|
new->c[0] = crops[0];
|
||||||
new->c[1] = crops[1];
|
new->c[1] = crops[1];
|
||||||
|
new->forced = forced;
|
||||||
event_list_insert_after(events, new);
|
event_list_insert_after(events, new);
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_event_xml (event_list_t *events, int split_at, int min_split, int start, int end, int graphics, crop_t *crops)
|
void add_event_xml (event_list_t *events, int split_at, int min_split, int start, int end, int graphics, crop_t *crops, int forced)
|
||||||
{
|
{
|
||||||
int image = start;
|
int image = start;
|
||||||
int d = end - start;
|
int d = end - start;
|
||||||
|
|
||||||
if (!split_at)
|
if (!split_at)
|
||||||
add_event_xml_real(events, image, start, end, graphics, crops);
|
add_event_xml_real(events, image, start, end, graphics, crops, forced);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (d >= split_at + min_split)
|
while (d >= split_at + min_split)
|
||||||
{
|
{
|
||||||
d -= split_at;
|
d -= split_at;
|
||||||
add_event_xml_real(events, image, start, start + split_at, graphics, crops);
|
add_event_xml_real(events, image, start, start + split_at, graphics, crops, forced);
|
||||||
start += split_at;
|
start += split_at;
|
||||||
}
|
}
|
||||||
if (d)
|
if (d)
|
||||||
add_event_xml_real(events, image, start, start + d, graphics, crops);
|
add_event_xml_real(events, image, start, start + d, graphics, crops, forced);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_sup_wrapper (sup_writer_t *sw, uint8_t *im, int num_crop, crop_t *crops, uint32_t *pal, int start, int end, int split_at, int min_split, int stricter)
|
void write_sup_wrapper (sup_writer_t *sw, uint8_t *im, int num_crop, crop_t *crops, uint32_t *pal, int start, int end, int split_at, int min_split, int stricter, int forced)
|
||||||
{
|
{
|
||||||
int d = end - start;
|
int d = end - start;
|
||||||
|
|
||||||
if (!split_at)
|
if (!split_at)
|
||||||
write_sup(sw, im, num_crop, crops, pal, start, end, stricter);
|
write_sup(sw, im, num_crop, crops, pal, start, end, stricter, forced);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (d >= split_at + min_split)
|
while (d >= split_at + min_split)
|
||||||
{
|
{
|
||||||
d -= split_at;
|
d -= split_at;
|
||||||
write_sup(sw, im, num_crop, crops, pal, start, start + split_at, stricter);
|
write_sup(sw, im, num_crop, crops, pal, start, start + split_at, stricter, forced);
|
||||||
start += split_at;
|
start += split_at;
|
||||||
}
|
}
|
||||||
if (d)
|
if (d)
|
||||||
write_sup(sw, im, num_crop, crops, pal, start, start + d, stricter);
|
write_sup(sw, im, num_crop, crops, pal, start, start + d, stricter, forced);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -820,6 +824,7 @@ int main (int argc, char *argv[])
|
|||||||
char *in_img = NULL, *old_img = NULL, *tmp = NULL, *out_buf = NULL;
|
char *in_img = NULL, *old_img = NULL, *tmp = NULL, *out_buf = NULL;
|
||||||
char *intc_buf = NULL, *outtc_buf = NULL;
|
char *intc_buf = NULL, *outtc_buf = NULL;
|
||||||
char *drop_frame = NULL;
|
char *drop_frame = NULL;
|
||||||
|
char *mark_forced_string = "0";
|
||||||
char png_dir[MAX_PATH + 1] = {0};
|
char png_dir[MAX_PATH + 1] = {0};
|
||||||
crop_t crops[2];
|
crop_t crops[2];
|
||||||
pic_t pic;
|
pic_t pic;
|
||||||
@ -853,6 +858,7 @@ int main (int argc, char *argv[])
|
|||||||
int xml_output = 0;
|
int xml_output = 0;
|
||||||
int allow_empty = 0;
|
int allow_empty = 0;
|
||||||
int stricter = 0;
|
int stricter = 0;
|
||||||
|
int mark_forced = 0;
|
||||||
sup_writer_t *sw = NULL;
|
sup_writer_t *sw = NULL;
|
||||||
avis_input_t *avis_hnd;
|
avis_input_t *avis_hnd;
|
||||||
stream_info_t *s_info = malloc(sizeof(stream_info_t));
|
stream_info_t *s_info = malloc(sizeof(stream_info_t));
|
||||||
@ -888,11 +894,12 @@ int main (int argc, char *argv[])
|
|||||||
, {"ugly", required_argument, 0, 'u'}
|
, {"ugly", required_argument, 0, 'u'}
|
||||||
, {"null-xml", required_argument, 0, 'n'}
|
, {"null-xml", required_argument, 0, 'n'}
|
||||||
, {"stricter", required_argument, 0, 'z'}
|
, {"stricter", required_argument, 0, 'z'}
|
||||||
|
, {"forced", required_argument, 0, 'F'}
|
||||||
, {0, 0, 0, 0}
|
, {0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
|
|
||||||
c = getopt_long(argc, argv, "o:j:c:t:l:v:f:x:y:d:b:s:m:e:p:a:u:n:z:", long_options, &option_index);
|
c = getopt_long(argc, argv, "o:j:c:t:l:v:f:x:y:d:b:s:m:e:p:a:u:n:z:F:", long_options, &option_index);
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
switch (c)
|
switch (c)
|
||||||
@ -960,6 +967,9 @@ int main (int argc, char *argv[])
|
|||||||
case 'z':
|
case 'z':
|
||||||
stricter_string = optarg;
|
stricter_string = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'F':
|
||||||
|
mark_forced_string = optarg;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
print_usage();
|
print_usage();
|
||||||
return 0;
|
return 0;
|
||||||
@ -1028,6 +1038,7 @@ int main (int argc, char *argv[])
|
|||||||
min_split = parse_int(minimum_split, "min-split", NULL);
|
min_split = parse_int(minimum_split, "min-split", NULL);
|
||||||
if (!min_split)
|
if (!min_split)
|
||||||
min_split = 1;
|
min_split = 1;
|
||||||
|
mark_forced = parse_int(mark_forced_string, "forced", NULL);
|
||||||
|
|
||||||
/* TODO: Sanity check video_format and frame_rate. */
|
/* TODO: Sanity check video_format and frame_rate. */
|
||||||
|
|
||||||
@ -1160,13 +1171,13 @@ int main (int argc, char *argv[])
|
|||||||
if (sup_output)
|
if (sup_output)
|
||||||
{
|
{
|
||||||
assert(pal != NULL);
|
assert(pal != NULL);
|
||||||
write_sup_wrapper(sw, (uint8_t *)out_buf, n_crop, crops, pal, start_frame + to, i + to, split_at, min_split, stricter);
|
write_sup_wrapper(sw, (uint8_t *)out_buf, n_crop, crops, pal, start_frame + to, i + to, split_at, min_split, stricter, mark_forced);
|
||||||
if (!xml_output)
|
if (!xml_output)
|
||||||
free(pal);
|
free(pal);
|
||||||
pal = NULL;
|
pal = NULL;
|
||||||
}
|
}
|
||||||
if (xml_output)
|
if (xml_output)
|
||||||
add_event_xml(events, split_at, min_split, start_frame + to, i + to, n_crop, crops);
|
add_event_xml(events, split_at, min_split, start_frame + to, i + to, n_crop, crops, mark_forced);
|
||||||
end_frame = i;
|
end_frame = i;
|
||||||
have_line = 0;
|
have_line = 0;
|
||||||
}
|
}
|
||||||
@ -1224,14 +1235,14 @@ int main (int argc, char *argv[])
|
|||||||
if (sup_output)
|
if (sup_output)
|
||||||
{
|
{
|
||||||
assert(pal != NULL);
|
assert(pal != NULL);
|
||||||
write_sup_wrapper(sw, (uint8_t *)out_buf, n_crop, crops, pal, start_frame + to, i - 1 + to, split_at, min_split, stricter);
|
write_sup_wrapper(sw, (uint8_t *)out_buf, n_crop, crops, pal, start_frame + to, i - 1 + to, split_at, min_split, stricter, mark_forced);
|
||||||
if (!xml_output)
|
if (!xml_output)
|
||||||
free(pal);
|
free(pal);
|
||||||
pal = NULL;
|
pal = NULL;
|
||||||
}
|
}
|
||||||
if (xml_output)
|
if (xml_output)
|
||||||
{
|
{
|
||||||
add_event_xml(events, split_at, min_split, start_frame + to, i - 1 + to, n_crop, crops);
|
add_event_xml(events, split_at, min_split, start_frame + to, i - 1 + to, n_crop, crops, mark_forced);
|
||||||
free(pal);
|
free(pal);
|
||||||
pal = NULL;
|
pal = NULL;
|
||||||
}
|
}
|
||||||
@ -1298,13 +1309,13 @@ int main (int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
mk_timecode(event->start_frame, fps, intc_buf);
|
mk_timecode(event->start_frame, fps, intc_buf);
|
||||||
mk_timecode(event->end_frame, fps, outtc_buf);
|
mk_timecode(event->end_frame, fps, outtc_buf);
|
||||||
|
|
||||||
if (auto_cut && event->end_frame == frames - 1)
|
if (auto_cut && event->end_frame == frames - 1)
|
||||||
{
|
{
|
||||||
mk_timecode(event->end_frame + 1, fps, outtc_buf);
|
mk_timecode(event->end_frame + 1, fps, outtc_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(fh, "<Event Forced=\"False\" InTC=\"%s\" OutTC=\"%s\">\n", intc_buf, outtc_buf);
|
fprintf(fh, "<Event Forced=\"%s\" InTC=\"%s\" OutTC=\"%s\">\n", (event->forced ? "True" : "False"), intc_buf, outtc_buf);
|
||||||
for (i = 0; i < event->graphics; i++)
|
for (i = 0; i < event->graphics; i++)
|
||||||
{
|
{
|
||||||
fprintf(fh, "<Graphic Width=\"%d\" Height=\"%d\" X=\"%d\" Y=\"%d\">%08d_%d.png</Graphic>\n", event->c[i].w, event->c[i].h, xo + event->c[i].x, yo + event->c[i].y, event->image_number - to, i);
|
fprintf(fh, "<Graphic Width=\"%d\" Height=\"%d\" X=\"%d\" Y=\"%d\">%08d_%d.png</Graphic>\n", event->c[i].w, event->c[i].h, xo + event->c[i].x, yo + event->c[i].y, event->image_number - to, i);
|
||||||
|
BIN
avs2bdnxml.exe
BIN
avs2bdnxml.exe
Binary file not shown.
BIN
avs2bdnxml.o
BIN
avs2bdnxml.o
Binary file not shown.
BIN
palletize.o
BIN
palletize.o
Binary file not shown.
17
sup.c
17
sup.c
@ -194,13 +194,13 @@ static void write_pcs_start (FILE *fh, int start_time, int dts, int follower, in
|
|||||||
fwrite(&pcss, sizeof(pcss), 1, fh);
|
fwrite(&pcss, sizeof(pcss), 1, fh);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_pcs_start_obj (FILE *fh, int picture, int window, int x_off, int y_off)
|
static void write_pcs_start_obj (FILE *fh, int picture, int window, int x_off, int y_off, int forced)
|
||||||
{
|
{
|
||||||
sup_pcs_start_obj_t pcsso;
|
sup_pcs_start_obj_t pcsso;
|
||||||
|
|
||||||
pcsso.picture = picture;
|
pcsso.picture = picture;
|
||||||
pcsso.window = window;
|
pcsso.window = window;
|
||||||
pcsso.forced = 0;
|
pcsso.forced = (forced ? 64 : 0);
|
||||||
pcsso.x_off = x_off;
|
pcsso.x_off = x_off;
|
||||||
pcsso.y_off = y_off;
|
pcsso.y_off = y_off;
|
||||||
|
|
||||||
@ -513,7 +513,7 @@ void destroy_si (subtitle_info_t *si)
|
|||||||
free(si);
|
free(si);
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_subtitle (sup_writer_t *sw, uint8_t **rle, int *rle_len, int num_crop, rect_t *crops, uint32_t *pal, int start, int end, int new_composition)
|
void write_subtitle (sup_writer_t *sw, uint8_t **rle, int *rle_len, int num_crop, rect_t *crops, uint32_t *pal, int start, int end, int new_composition, int forced)
|
||||||
{
|
{
|
||||||
uint32_t frame_ts, window_ts, decode_ts;
|
uint32_t frame_ts, window_ts, decode_ts;
|
||||||
uint32_t window_ts_list[2], decode_ts_list[2];
|
uint32_t window_ts_list[2], decode_ts_list[2];
|
||||||
@ -594,7 +594,7 @@ void write_subtitle (sup_writer_t *sw, uint8_t **rle, int *rle_len, int num_crop
|
|||||||
/* Write PCSS */
|
/* Write PCSS */
|
||||||
write_pcs_start(sw->fh, start_ts, dts, follower, num_crop, sw->im_w, sw->im_h, sw->fps_id, sw->comp_num);
|
write_pcs_start(sw->fh, start_ts, dts, follower, num_crop, sw->im_w, sw->im_h, sw->fps_id, sw->comp_num);
|
||||||
for (i = 0; i < num_crop; i++)
|
for (i = 0; i < num_crop; i++)
|
||||||
write_pcs_start_obj(sw->fh, sw->picture_offset + i, in_window[i], crops[i].x, crops[i].y);
|
write_pcs_start_obj(sw->fh, sw->picture_offset + i, in_window[i], crops[i].x, crops[i].y, forced);
|
||||||
|
|
||||||
/* Write WDS */
|
/* Write WDS */
|
||||||
ts = start_ts - window_ts; /* Can be very slightly off, possible rounding error (FIXME: fixed?) */
|
ts = start_ts - window_ts; /* Can be very slightly off, possible rounding error (FIXME: fixed?) */
|
||||||
@ -701,7 +701,7 @@ void write_composition (sup_writer_t *sw)
|
|||||||
}
|
}
|
||||||
last_num_crop = si->num_crop;
|
last_num_crop = si->num_crop;
|
||||||
memcpy(last_crops, si->crops, si->num_crop * sizeof(rect_t));
|
memcpy(last_crops, si->crops, si->num_crop * sizeof(rect_t));
|
||||||
write_subtitle(sw, si->rle, si->rle_len, si->num_crop, si->crops, si->pal, si->start, si->end, new_composition);
|
write_subtitle(sw, si->rle, si->rle_len, si->num_crop, si->crops, si->pal, si->start, si->end, new_composition, si->forced);
|
||||||
new_composition = 0;
|
new_composition = 0;
|
||||||
si_list_delete(sw->sil);
|
si_list_delete(sw->sil);
|
||||||
destroy_si(si);
|
destroy_si(si);
|
||||||
@ -735,7 +735,7 @@ void write_composition (sup_writer_t *sw)
|
|||||||
sw->buffer = 0;
|
sw->buffer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
subtitle_info_t *collect_si (sup_writer_t *sw, uint8_t *im, int num_crop, rect_t *crops, uint32_t *pal, int start, int end)
|
subtitle_info_t *collect_si (sup_writer_t *sw, uint8_t *im, int num_crop, rect_t *crops, uint32_t *pal, int start, int end, int forced)
|
||||||
{
|
{
|
||||||
subtitle_info_t *si = malloc(sizeof(subtitle_info_t));
|
subtitle_info_t *si = malloc(sizeof(subtitle_info_t));
|
||||||
int i;
|
int i;
|
||||||
@ -752,6 +752,7 @@ subtitle_info_t *collect_si (sup_writer_t *sw, uint8_t *im, int num_crop, rect_t
|
|||||||
si->rle[i] = rl_encode(im, sw->im_w, sw->im_h, si->crops[i], &(si->rle_len[i]));
|
si->rle[i] = rl_encode(im, sw->im_w, sw->im_h, si->crops[i], &(si->rle_len[i]));
|
||||||
}
|
}
|
||||||
memcpy(si->pal, pal, 256 * sizeof(uint32_t));
|
memcpy(si->pal, pal, 256 * sizeof(uint32_t));
|
||||||
|
si->forced = forced;
|
||||||
|
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
@ -774,7 +775,7 @@ void close_sup_writer (sup_writer_t *sw)
|
|||||||
|
|
||||||
IMPLEMENT_LIST(si, subtitle_info_t)
|
IMPLEMENT_LIST(si, subtitle_info_t)
|
||||||
|
|
||||||
void write_sup (sup_writer_t *sw, uint8_t *im, int num_crop, rect_t *crops, uint32_t *pal, int start, int end, int strict)
|
void write_sup (sup_writer_t *sw, uint8_t *im, int num_crop, rect_t *crops, uint32_t *pal, int start, int end, int strict, int forced)
|
||||||
{
|
{
|
||||||
rect_t tmp;
|
rect_t tmp;
|
||||||
int buffer_increase;
|
int buffer_increase;
|
||||||
@ -831,6 +832,6 @@ void write_sup (sup_writer_t *sw, uint8_t *im, int num_crop, rect_t *crops, uint
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
si_list_insert_after(sw->sil, collect_si(sw, im, num_crop, crops, pal, start, end));
|
si_list_insert_after(sw->sil, collect_si(sw, im, num_crop, crops, pal, start, end, forced));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
3
sup.h
3
sup.h
@ -31,6 +31,7 @@ typedef struct subtitle_info_s
|
|||||||
int rle_len[2];
|
int rle_len[2];
|
||||||
uint8_t *rle[2];
|
uint8_t *rle[2];
|
||||||
uint32_t pal[256];
|
uint32_t pal[256];
|
||||||
|
int forced;
|
||||||
} subtitle_info_t;
|
} subtitle_info_t;
|
||||||
|
|
||||||
DECLARE_LIST(si, subtitle_info_t)
|
DECLARE_LIST(si, subtitle_info_t)
|
||||||
@ -64,7 +65,7 @@ typedef struct sup_writer_s
|
|||||||
sup_writer_t *new_sup_writer (char *filename, int im_w, int im_h, int fps_num, int fps_den);
|
sup_writer_t *new_sup_writer (char *filename, int im_w, int im_h, int fps_num, int fps_den);
|
||||||
|
|
||||||
/* Write sup data for subtitle */
|
/* Write sup data for subtitle */
|
||||||
void write_sup (sup_writer_t *sw, uint8_t *im, int num_crop, rect_t *crops, uint32_t *pal, int start, int end, int strict);
|
void write_sup (sup_writer_t *sw, uint8_t *im, int num_crop, rect_t *crops, uint32_t *pal, int start, int end, int strict, int forced);
|
||||||
|
|
||||||
/* Call this once at the end */
|
/* Call this once at the end */
|
||||||
void close_sup_writer (sup_writer_t *sw);
|
void close_sup_writer (sup_writer_t *sw);
|
||||||
|
Loading…
Reference in New Issue
Block a user