27 #include <aribb24/aribb24.h>
28 #include <aribb24/parser.h>
29 #include <aribb24/decoder.h>
63 unsigned int plane_width = 0;
64 unsigned int plane_height = 0;
65 unsigned int font_size = 0;
85 "; Script generated by FFmpeg/Lavc%s\r\n"
86 "ScriptType: v4.00+\r\n"
94 "Fontname, Fontsize, "
95 "PrimaryColour, SecondaryColour, OutlineColour, BackColour, "
96 "Bold, Italic, Underline, StrikeOut, "
99 "BorderStyle, Outline, Shadow, "
100 "Alignment, MarginL, MarginR, MarginV, "
106 "&H%x,&H%x,&H%x,&H%x,"
116 "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n",
118 plane_width, plane_height,
162 arib_dec_init = arib_initialize_decoder_a_profile;
165 arib_dec_init = arib_initialize_decoder_c_profile;
184 arib_finalize_decoder(b24->
decoder);
197 arib_finalize_decoder(b24->
decoder);
205 #define RGB_TO_BGR(c) (((c) & 0xff) << 16 | ((c) & 0xff00) | (((c) >> 16) & 0xff))
210 const arib_buf_region_t *region = arib_decoder_get_regions(b24->
decoder);
212 AVBPrint buf = { 0 };
218 ptrdiff_t region_length = region->p_end - region->p_start;
219 unsigned int ruby_region =
220 region->i_fontheight == (profile_font_size / 2);
223 int foreground_bgr_color =
RGB_TO_BGR(region->i_foreground_color);
224 int background_bgr_color =
RGB_TO_BGR(region->i_background_color);
226 if (region_length < 0) {
238 av_bprintf(&buf,
"{\\1c&H%06x&}", foreground_bgr_color);
240 if (region->i_foreground_alpha != 0)
241 av_bprintf(&buf,
"{\\1a&H%02x&}", region->i_foreground_alpha);
244 av_bprintf(&buf,
"{\\3c&H%06x&}", background_bgr_color);
246 if (region->i_background_alpha != 0)
247 av_bprintf(&buf,
"{\\3a&H%02x&}", region->i_background_alpha);
250 if (region->i_fontwidth != profile_font_size ||
251 region->i_fontheight != profile_font_size) {
252 av_bprintf(&buf,
"{\\fscx%"PRId64
"\\fscy%"PRId64
"}",
266 region = region->p_next;
289 size_t parsed_data_size = 0;
290 size_t decoded_subtitle_size = 0;
291 const unsigned char *parsed_data =
NULL;
292 char *decoded_subtitle =
NULL;
293 time_t subtitle_duration = 0;
301 parsed_data = arib_parser_get_data(b24->
parser,
303 if (!parsed_data || !parsed_data_size) {
305 "packet (dts: %"PRId64
", pts: %"PRId64
").\n",
310 decoded_subtitle_size = parsed_data_size * 4;
311 if (!(decoded_subtitle =
av_mallocz(decoded_subtitle_size + 1))) {
313 "Failed to allocate buffer for decoded subtitle!\n");
317 decoded_subtitle_size = arib_decode_buffer(b24->
decoder,
321 decoded_subtitle_size);
323 subtitle_duration = arib_decoder_get_time(b24->
decoder);
329 sub->end_display_time = subtitle_duration ?
336 "Result: '%s' (size: %zu, pkt_pts: %"PRId64
", sub_pts: %"PRId64
" "
337 "duration: %"PRIu32
", pkt_timebase: %d/%d, time_base: %d/%d')\n",
338 decoded_subtitle ? decoded_subtitle :
"<no subtitle>",
339 decoded_subtitle_size,
341 sub->end_display_time,
345 if (decoded_subtitle)
348 *got_sub_ptr =
sub->num_rects > 0;
354 arib_finalize_decoder(b24->
decoder);
356 return ret < 0 ? ret :
pkt->
size;
366 #define OFFSET(x) offsetof(Libaribb24Context, x)
367 #define SD AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_DECODING_PARAM
369 {
"aribb24-base-path",
"set the base path for the libaribb24 library",
371 {
"aribb24-skip-ruby-text",
"skip ruby text blocks during decoding",
384 .
name =
"libaribb24",
394 .wrapper_name =
"libaribb24",
static void flush(AVCodecContext *avctx)
int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, int readorder, int layer, const char *style, const char *speaker)
Add an ASS dialog to a subtitle.
#define ASS_DEFAULT_ALIGNMENT
#define ASS_DEFAULT_COLOR
#define ASS_DEFAULT_BORDERSTYLE
#define ASS_DEFAULT_BACK_COLOR
#define ASS_DEFAULT_UNDERLINE
#define ASS_DEFAULT_ITALIC
Libavcodec external API header.
#define FF_PROFILE_ARIB_PROFILE_C
#define FF_PROFILE_ARIB_PROFILE_A
static av_cold int init(AVCodecContext *avctx)
char * av_asprintf(const char *fmt,...)
void av_bprintf(AVBPrint *buf, const char *fmt,...)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size)
Append data to a print buffer.
#define AV_BPRINT_SIZE_UNLIMITED
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static float sub(float src0, float src1)
#define AV_CODEC_FLAG2_RO_FLUSH_NOOP
Do not reset ASS ReadOrder field on flush (subtitles decoding)
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
@ AV_CODEC_ID_ARIB_CAPTION
#define AVERROR_EXTERNAL
Generic error in an external library.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
#define LIBAVUTIL_VERSION_INT
static void libaribb24_flush(AVCodecContext *avctx)
static int libaribb24_generate_ass_header(AVCodecContext *avctx)
static const AVOption options[]
static unsigned int get_profile_font_size(int profile)
static void libaribb24_log(void *p, const char *msg)
static int libaribb24_decode(AVCodecContext *avctx, void *data, int *got_sub_ptr, AVPacket *pkt)
static int libaribb24_init(AVCodecContext *avctx)
AVCodec ff_libaribb24_decoder
static int libaribb24_handle_regions(AVCodecContext *avctx, AVSubtitle *sub)
static const AVClass aribb24_class
static int libaribb24_close(AVCodecContext *avctx)
static const chunk_decoder decoder[8]
#define LIBAVCODEC_VERSION
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
typedef void(RENAME(mix_any_func_type))
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
main external API structure.
int flags2
AV_CODEC_FLAG2_*.
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are.
uint8_t * subtitle_header
Header containing style information for text subtitles.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Rational number (pair of numerator and denominator).
arib_instance_t * lib_instance
unsigned int aribb24_skip_ruby