27 #define SCREEN_ROWS 15
28 #define SCREEN_COLUMNS 32
30 #define SET_FLAG(var, val) ( (var) |= ( 1 << (val)) )
31 #define UNSET_FLAG(var, val) ( (var) &= ~( 1 << (val)) )
32 #define CHECK_FLAG(var, val) ( (var) & ( 1 << (val)) )
106 1, 0, 0, 1, 0, 1, 1, 0,
107 1, 0, 0, 1, 0, 1, 1, 0,
108 0, 1, 1, 0, 1, 0, 0, 1,
109 1, 0, 0, 1, 0, 1, 1, 0,
110 0, 1, 1, 0, 1, 0, 0, 1,
111 0, 1, 1, 0, 1, 0, 0, 1,
112 1, 0, 0, 1, 0, 1, 1, 0,
113 1, 0, 0, 1, 0, 1, 1, 0,
114 0, 1, 1, 0, 1, 0, 0, 1,
115 0, 1, 1, 0, 1, 0, 0, 1,
116 1, 0, 0, 1, 0, 1, 1, 0,
117 0, 1, 1, 0, 1, 0, 0, 1,
118 1, 0, 0, 1, 0, 1, 1, 0,
119 1, 0, 0, 1, 0, 1, 1, 0,
120 0, 1, 1, 0, 1, 0, 0, 1,
121 1, 0, 0, 1, 0, 1, 1, 0,
122 0, 1, 1, 0, 1, 0, 0, 1,
123 0, 1, 1, 0, 1, 0, 0, 1,
124 1, 0, 0, 1, 0, 1, 1, 0,
125 0, 1, 1, 0, 1, 0, 0, 1,
126 1, 0, 0, 1, 0, 1, 1, 0,
127 1, 0, 0, 1, 0, 1, 1, 0,
128 0, 1, 1, 0, 1, 0, 0, 1,
129 0, 1, 1, 0, 1, 0, 0, 1,
130 1, 0, 0, 1, 0, 1, 1, 0,
131 1, 0, 0, 1, 0, 1, 1, 0,
132 0, 1, 1, 0, 1, 0, 0, 1,
133 1, 0, 0, 1, 0, 1, 1, 0,
134 0, 1, 1, 0, 1, 0, 0, 1,
135 0, 1, 1, 0, 1, 0, 0, 1,
136 1, 0, 0, 1, 0, 1, 1, 0 };
233 uint8_t cc_valid = (*cc_data_pair & 4) >>2;
234 uint8_t cc_type = *cc_data_pair & 3;
240 if (cc_type==0 || cc_type==1) {
245 cc_data_pair[1]=0x7F;
250 if( (cc_data_pair[0] == 0xFA || cc_data_pair[0] == 0xFC || cc_data_pair[0] == 0xFD )
251 && (cc_data_pair[1] & 0x7F) == 0 && (cc_data_pair[2] & 0x7F) == 0)
255 if(cc_type == 3 || cc_type == 2 )
259 cc_data_pair[1] &= 0x7F;
260 cc_data_pair[2] &= 0x7F;
300 for( i = 0; i < ctx->
cursor_row - keep_lines; i++ )
304 for( i = 0; i < keep_lines && screen->
row_used; i++ ) {
305 const int i_row = ctx->
cursor_row - keep_lines + i + 1;
372 static const int8_t row_map[] = {
373 11, -1, 1, 2, 3, 4, 12, 13, 14, 15, 5, 6, 7, 8, 9, 10
375 const int index = ( (hi<<1) & 0x0e) | ( (lo>>5) & 0x01 );
380 if( row_map[index] <= 0 ) {
393 for(i = 0;i < indent; i++) {
455 ff_dlog(ctx,
"(%c,%c)\n",hi,lo);
463 #define COR3(var, with1, with2, with3) ( (var) == (with1) || (var) == (with2) || (var) == (with3) )
466 }
else if ( (hi == 0x10 && (lo >= 0x40 || lo <= 0x5f)) ||
467 ( (hi >= 0x11 && hi <= 0x17) && (lo >= 0x40 && lo <= 0x7f) ) ) {
469 }
else if ( ( hi == 0x11 && lo >= 0x20 && lo <= 0x2f ) ||
470 ( hi == 0x17 && lo >= 0x2e && lo <= 0x2f) ) {
472 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x20 ) {
475 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x24 ) {
477 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x25 ) {
480 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x26 ) {
483 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x27 ) {
486 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x29 ) {
489 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x2B ) {
492 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x2C ) {
495 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x2D ) {
497 ff_dlog(ctx,
"carriage return\n");
502 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x2F ) {
506 }
else if (hi>=0x20) {
511 ff_dlog(ctx,
"Unknown command 0x%hhx 0x%hhx\n", hi, lo);
544 for (i = 0; i <
len; i += 3) {
545 uint8_t cc_type = *(bptr + i) & 3;
552 process_cc608(ctx, avpkt->
pts, *(bptr + i + 1) & 0x7f, *(bptr + i + 2) & 0x7f);
567 *got_sub = sub->num_rects > 0;
591 .priv_class = &ccaption_dec_class,
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
void av_bprintf(AVBPrint *buf, const char *fmt,...)
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
ptrdiff_t const GLvoid * data
static void handle_pac(CCaptionSubContext *ctx, uint8_t hi, uint8_t lo)
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
static av_cold int init(AVCodecContext *avctx)
static struct Screen * get_writing_screen(CCaptionSubContext *ctx)
uint8_t colors[SCREEN_ROWS][SCREEN_COLUMNS+1]
static void handle_delete_end_of_row(CCaptionSubContext *ctx, char hi, char lo)
static void handle_char(CCaptionSubContext *ctx, char hi, char lo, int64_t pts)
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
#define CHECK_FLAG(var, val)
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static int write_char(CCaptionSubContext *ctx, char *row, uint8_t col, char ch)
static int64_t start_time
static int handle_edm(CCaptionSubContext *ctx, int64_t pts)
int ff_ass_subtitle_header_default(AVCodecContext *avctx)
Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS with default style.
static int reap_screen(CCaptionSubContext *ctx, int64_t pts)
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
#define AV_BPRINT_SIZE_UNLIMITED
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define COR3(var, with1, with2, with3)
const char * name
Name of the codec implementation.
AVCodec ff_ccaption_decoder
int av_buffer_realloc(AVBufferRef **pbuf, int size)
Reallocate a given buffer.
Libavcodec external API header.
uint8_t fonts[SCREEN_ROWS][SCREEN_COLUMNS+1]
int64_t pts
Same as packet pts, in AV_TIME_BASE.
common internal API header
static SDL_Surface * screen
#define SET_FLAG(var, val)
static av_cold int init_decoder(AVCodecContext *avctx)
static int process_cc608(CCaptionSubContext *ctx, int64_t pts, uint8_t hi, uint8_t lo)
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
static int handle_eoc(CCaptionSubContext *ctx, int64_t pts)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
AVBufferRef * av_buffer_alloc(int size)
Allocate an AVBuffer of the given size using av_malloc().
static const unsigned char pac2_attribs[32][3]
int ff_ass_add_rect_bprint(AVSubtitle *sub, AVBPrint *buf, int ts_start, int duration)
Same as ff_ass_add_rect_bprint, but taking an AVBPrint buffer instead of a string, and assuming raw=0.
main external API structure.
uint8_t * data
The data buffer.
uint8_t characters[SCREEN_ROWS][SCREEN_COLUMNS+1]
Describe the class of an AVClass context structure.
rational number numerator/denominator
int size
Size of data in bytes.
static int64_t pts
Global timestamp for the audio frames.
static const AVClass ccaption_dec_class
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
static void roll_up(CCaptionSubContext *ctx)
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
A reference to a data buffer.
static const AVOption options[]
#define UNSET_FLAG(var, val)
static void handle_textattr(CCaptionSubContext *ctx, uint8_t hi, uint8_t lo)
static av_cold int close_decoder(AVCodecContext *avctx)
static const uint8_t parity_table[256]
static int validate_cc_data_pair(uint8_t *cc_data_pair)
This function after validating parity bit, also remove it from data pair.
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...