26 #define SCREEN_ROWS 15
27 #define SCREEN_COLUMNS 32
29 #define SET_FLAG(var, val) ( (var) |= ( 1 << (val)) )
30 #define UNSET_FLAG(var, val) ( (var) &= ~( 1 << (val)) )
31 #define CHECK_FLAG(var, val) ( (var) & ( 1 << (val)) )
105 1, 0, 0, 1, 0, 1, 1, 0,
106 1, 0, 0, 1, 0, 1, 1, 0,
107 0, 1, 1, 0, 1, 0, 0, 1,
108 1, 0, 0, 1, 0, 1, 1, 0,
109 0, 1, 1, 0, 1, 0, 0, 1,
110 0, 1, 1, 0, 1, 0, 0, 1,
111 1, 0, 0, 1, 0, 1, 1, 0,
112 1, 0, 0, 1, 0, 1, 1, 0,
113 0, 1, 1, 0, 1, 0, 0, 1,
114 0, 1, 1, 0, 1, 0, 0, 1,
115 1, 0, 0, 1, 0, 1, 1, 0,
116 0, 1, 1, 0, 1, 0, 0, 1,
117 1, 0, 0, 1, 0, 1, 1, 0,
118 1, 0, 0, 1, 0, 1, 1, 0,
119 0, 1, 1, 0, 1, 0, 0, 1,
120 1, 0, 0, 1, 0, 1, 1, 0,
121 0, 1, 1, 0, 1, 0, 0, 1,
122 0, 1, 1, 0, 1, 0, 0, 1,
123 1, 0, 0, 1, 0, 1, 1, 0,
124 0, 1, 1, 0, 1, 0, 0, 1,
125 1, 0, 0, 1, 0, 1, 1, 0,
126 1, 0, 0, 1, 0, 1, 1, 0,
127 0, 1, 1, 0, 1, 0, 0, 1,
128 0, 1, 1, 0, 1, 0, 0, 1,
129 1, 0, 0, 1, 0, 1, 1, 0,
130 1, 0, 0, 1, 0, 1, 1, 0,
131 0, 1, 1, 0, 1, 0, 0, 1,
132 1, 0, 0, 1, 0, 1, 1, 0,
133 0, 1, 1, 0, 1, 0, 0, 1,
134 0, 1, 1, 0, 1, 0, 0, 1,
135 1, 0, 0, 1, 0, 1, 1, 0 };
234 uint8_t cc_valid = (*cc_data_pair & 4) >>2;
235 uint8_t cc_type = *cc_data_pair & 3;
241 if (cc_type==0 || cc_type==1) {
246 cc_data_pair[1]=0x7F;
251 if( (cc_data_pair[0] == 0xFA || cc_data_pair[0] == 0xFC || cc_data_pair[0] == 0xFD )
252 && (cc_data_pair[1] & 0x7F) == 0 && (cc_data_pair[2] & 0x7F) == 0)
256 if(cc_type == 3 || cc_type == 2 )
260 cc_data_pair[1] &= 0x7F;
261 cc_data_pair[2] &= 0x7F;
301 for( i = 0; i < ctx->
cursor_row - keep_lines; i++ )
305 for( i = 0; i < keep_lines && screen->
row_used; i++ ) {
306 const int i_row = ctx->
cursor_row - keep_lines + i + 1;
369 static const int8_t row_map[] = {
370 11, -1, 1, 2, 3, 4, 12, 13, 14, 15, 5, 6, 7, 8, 9, 10
372 const int index = ( (hi<<1) & 0x0e) | ( (lo>>5) & 0x01 );
377 if( row_map[index] <= 0 ) {
390 for(i = 0;i < indent; i++) {
452 av_dlog(ctx,
"(%c,%c)\n",hi,lo);
460 #define COR3(var, with1, with2, with3) ( (var) == (with1) || (var) == (with2) || (var) == (with3) )
463 }
else if ( (hi == 0x10 && (lo >= 0x40 || lo <= 0x5f)) ||
464 ( (hi >= 0x11 && hi <= 0x17) && (lo >= 0x40 && lo <= 0x7f) ) ) {
466 }
else if ( ( hi == 0x11 && lo >= 0x20 && lo <= 0x2f ) ||
467 ( hi == 0x17 && lo >= 0x2e && lo <= 0x2f) ) {
469 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x20 ) {
472 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x24 ) {
474 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x25 ) {
477 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x26 ) {
480 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x27 ) {
483 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x29 ) {
486 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x2B ) {
489 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x2C ) {
492 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x2D ) {
494 av_dlog(ctx,
"carriage return\n");
499 }
else if (
COR3(hi, 0x14, 0x15, 0x1C) && lo == 0x2F ) {
503 }
else if (hi>=0x20) {
508 av_dlog(ctx,
"Unknown command 0x%hhx 0x%hhx\n", hi, lo);
541 for (i = 0; i <
len; i += 3) {
542 uint8_t cc_type = *(bptr + i) & 3;
549 process_cc608(ctx, avpkt->
pts, *(bptr + i + 1) & 0x7f, *(bptr + i + 2) & 0x7f);
588 .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)
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
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]
int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, int ts_start, int duration, int raw)
Add an ASS dialog line to an AVSubtitle as a new AVSubtitleRect.
int64_t pts
Same as packet pts, in AV_TIME_BASE.
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]
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...