Go to the documentation of this file.
33 #define STYLE_FLAG_BOLD (1<<0)
34 #define STYLE_FLAG_ITALIC (1<<1)
35 #define STYLE_FLAG_UNDERLINE (1<<2)
37 #define BOX_SIZE_INITIAL 40
39 #define STYL_BOX (1<<0)
40 #define HLIT_BOX (1<<1)
41 #define HCLR_BOX (1<<2)
42 #define TWRP_BOX (1<<3)
45 #define BOTTOM_CENTER 2
46 #define BOTTOM_RIGHT 3
48 #define MIDDLE_CENTER 5
49 #define MIDDLE_RIGHT 6
54 #define RGB_TO_BGR(c) (((c) & 0xff) << 16 | ((c) & 0xff00) | (((c) >> 16) & 0xff))
88 uint8_t hlit_color[4];
135 style->
font_id = bytestream_get_be16(ptr);
137 style->
flags = bytestream_get_byte(ptr);
142 style->
fontsize = bytestream_get_byte(ptr);
144 style->
color = bytestream_get_be24(ptr);
146 style->
alpha = bytestream_get_byte(ptr);
151 const uint8_t *tx3g_ptr = avctx->
extradata;
153 int8_t v_align, h_align;
154 unsigned ftab_entries;
163 h_align = bytestream_get_byte(&tx3g_ptr);
164 v_align = bytestream_get_byte(&tx3g_ptr);
207 ftab_entries = bytestream_get_be16(&tx3g_ptr);
210 remaining -= 3 * ftab_entries;
222 font_length = bytestream_get_byte(&tx3g_ptr);
224 remaining -= font_length;
253 m->
h.
hlit_end = bytestream_get_be16(&tsmb);
266 #define CMP(field) ((a)->field == (b)->field)
275 int style_entries = bytestream_get_be16(&tsmb);
279 if (2 + style_entries * 12 >
size)
292 style->
start = bytestream_get_be16(&tsmb);
293 style->
end = bytestream_get_be16(&tsmb);
313 }
else if (
i && style->
start == style[-1].
end &&
316 style[-1].
end = style->
end;
337 const char *start = text;
340 GET_UTF8(
c, text < text_end ? (uint8_t)*text++ : (err = 1, 0),
goto error;);
348 static int text_to_ass(AVBPrint *buf,
const char *text,
const char *text_end,
358 if (text < text_end && m->box_flags &
TWRP_BOX) {
366 while (text < text_end) {
371 if (text_pos == style->
end) {
377 if (entry < m->style_entries && text_pos == style->
start) {
378 if (style->
bold ^ default_style->
bold)
411 av_bprintf(buf,
"{\\1c&H000000&}{\\2c&HFFFFFF&}");
465 (255
U - default_style->
alpha) << 24 | default_style->
color,
466 (255
U - default_style->
alpha) << 24 | default_style->
color,
476 int *got_sub_ptr,
const AVPacket *avpkt)
481 const char *ptr = avpkt->
data, *end;
485 if (!ptr || avpkt->
size < 2)
495 if (avpkt->
size == 2)
504 end = ptr +
FFMIN(2 + text_length, avpkt->
size);
513 if (text_length + 2 < avpkt->
size) {
514 const uint8_t *tsmb = end;
515 const uint8_t *
const tsmb_end = avpkt->
data + avpkt->
size;
517 while (tsmb_end - tsmb >= 8) {
518 uint64_t tsmb_size = bytestream_get_be32(&tsmb);
519 uint32_t tsmb_type = bytestream_get_be32(&tsmb);
520 int size_var, ret_tsmb;
522 if (tsmb_size == 1) {
523 if (tsmb_end - tsmb < 8)
525 tsmb_size = bytestream_get_be64(&tsmb);
531 if (tsmb_size < size_var) {
535 tsmb_size -= size_var;
537 if (tsmb_end - tsmb < tsmb_size)
579 #define OFFSET(x) offsetof(MovTextContext, x)
580 #define FLAGS AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_SUBTITLE_PARAM
595 .
p.
name =
"mov_text",
static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
static void error(const char *err)
#define AV_BPRINT_SIZE_UNLIMITED
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
int ff_ass_subtitle_header_default(AVCodecContext *avctx)
Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS with default style.
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
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.
static void mov_text_parse_style_record(StyleBox *style, const uint8_t **ptr)
#define ASS_DEFAULT_BORDERSTYLE
static const AVOption options[]
const static size_t box_count
AVCodec p
The public AVCodec.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
static int get_utf8_length_at(const char *text, const char *text_end)
int(* decode)(const uint8_t *tsmb, MovTextContext *m, uint64_t size)
static const Box box_types[]
#define GET_UTF8(val, GET_BYTE, ERROR)
Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
static int mov_text_init(AVCodecContext *avctx)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define FF_ARRAY_ELEMS(a)
#define STYLE_FLAG_UNDERLINE
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static void mov_text_flush(AVCodecContext *avctx)
static const AVClass mov_text_decoder_class
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
int ff_ass_subtitle_header_full(AVCodecContext *avctx, int play_res_x, int play_res_y, const char *font, int font_size, int primary_color, int secondary_color, int outline_color, int back_color, int bold, int italic, int underline, int border_style, int alignment)
Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS.
static void mov_text_cleanup(MovTextContext *m)
#define CODEC_LONG_NAME(str)
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end, AVCodecContext *avctx)
#define STYLE_FLAG_ITALIC
const char * av_default_item_name(void *ptr)
Return the context name.
#define ASS_DEFAULT_PLAYRESY
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int flags2
AV_CODEC_FLAG2_*.
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
#define ASS_DEFAULT_PLAYRESX
#define MKBETAG(a, b, c, d)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
static int decode_hclr(const uint8_t *tsmb, MovTextContext *m, uint64_t size)
static int decode_styl(const uint8_t *tsmb, MovTextContext *m, uint64_t size)
static int decode_hlit(const uint8_t *tsmb, MovTextContext *m, uint64_t size)
#define i(width, name, range_min, range_max)
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static int decode_twrp(const uint8_t *tsmb, MovTextContext *m, uint64_t size)
const char * name
Name of the codec implementation.
void * av_calloc(size_t nmemb, size_t size)
static av_always_inline unsigned int bytestream_get_buffer(const uint8_t **b, uint8_t *dst, unsigned int size)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
void av_bprintf(AVBPrint *buf, const char *fmt,...)
main external API structure.
const FFCodec ff_movtext_decoder
@ AV_OPT_TYPE_INT
Underlying C type is int.
static int styles_equivalent(const StyleBox *a, const StyleBox *b)
#define FF_CODEC_DECODE_SUB_CB(func)
static void mov_text_cleanup_ftab(MovTextContext *m)
static const int16_t alpha[]
This structure stores compressed data.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int mov_text_decode_close(AVCodecContext *avctx)
#define AV_CODEC_FLAG2_RO_FLUSH_NOOP
Do not reset ASS ReadOrder field on flush (subtitles decoding)
static int mov_text_decode_frame(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, const AVPacket *avpkt)
void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size)
Append data to a print buffer.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16