22 unsigned *count = userdata;
25 printf (
"[%02u:%02u:%02u.%03u] %s\n",
26 ms / 3600000, (ms / 60000) % 60, (ms / 1000) % 60, ms % 1000, line->
text);
41 for (; d != NULL; d = d->
next)
58 for (x = 0; x < d->
width; x++)
62 putchar (v == 0 ?
'.' : (v < 10 ?
'0' + v :
'a' + v - 10));
82 printf (
"[unidade] DRCS de %d byte(s)%s\n", one ? 1 : 2, d == NULL ?
": invalido" :
"");
93 printf (
"[unidade] bitmap: invalido\n");
95 printf (
"[unidade] bitmap: x=%d y=%d PNG %ux%u (%zu bytes) cores piscando=%u\n",
106 printf (
"[unidade] geometrico%s\n", g == NULL ?
": sem comandos" :
"");
108 for (i = g; i != NULL; i = i->next)
109 printf (
" %-12s opcode=0x%02x operandos=%zu\n",
120 printf (
"[unidade] som sintetizado: %zu byte(s)\n", s == NULL ? 0 : s->len);
132units_print (
const uint8_t *raw,
141 memset (&pes, 0,
sizeof (pes));
151 for (i = msgs; i != NULL; i = i->
next)
152 printf (
"[superimpose] %s\n", i->
text_utf8);
159on_pes (
const uint8_t *pes,
166 units_print (pes, len);
174 const char *filename)
179 printf (
"PIDs encontrados em '%s':\n", filename);
180 printf (
" %-6s %8s %-8s %s\n",
"PID",
"Pacotes",
"Programa",
"Tipo");
185 char program[16] =
"-";
192 snprintf (program,
sizeof (program),
"%u", info->
program);
194 printf (
" 0x%04x %8u %-8s %s%s\n", pid, info->
packets, program,
196 (pid == caption_pid) ?
" <- legenda" :
"");
202parse_pid (
const char *arg,
206 unsigned long value = strtoul (arg, &end, 0);
208 if (*arg ==
'\0' || *end !=
'\0' || value >=
TS_PID_MAX)
211 *pid = (uint16_t)value;
232 const uint8_t *packet;
235 int ret = EXIT_SUCCESS;
237 if (argc == 4 && strcmp (argv[3],
"--units") == 0)
243 if (argc < 2 || argc > 3 || (ctx.units && argc != 3))
245 fprintf (stderr,
"Uso: %s <arquivo.ts> [pid da legenda [--units]]\n"
246 " Sem o [pid], lista os PIDs encontrados no arquivo.\n"
247 " Com --units, mostra tambem as data units de DRCS, bitmap, geometrico,\n"
248 " som e as mensagens de superimpose.\n", argv[0]);
252 if (argc == 3 && !parse_pid (argv[2], &pid))
254 fprintf (stderr,
"PID inválido: '%s' (use decimal ou hexadecimal, ex: 0x3ed)\n", argv[2]);
262 fprintf (stderr,
"Erro ao abrir '%s': %s\n", argv[1], strerror (errno));
264 fprintf (stderr,
"'%s' não parece ser um MPEG-TS válido.\n", argv[1]);
266 fprintf (stderr,
"Memória insuficiente.\n");
273 fprintf (stderr,
"Memória insuficiente.\n");
283 fprintf (stderr,
"Memória insuficiente.\n");
301 pids_list (demux, argv[1]);
305 printf (
"\nNenhum PID de legenda encontrado na PMT.\n");
310 printf (
"\nPara exibir as legendas:\n %s %s 0x%04x\n",
322 fprintf (stderr,
"O PID 0x%04x não existe em '%s'.\n", pid, argv[1]);
327 fprintf (stderr,
"Nenhuma legenda encontrada no PID 0x%04x.\n", pid);
332 fprintf (stderr,
"\n%u linha(s) de legenda extraída(s) do PID 0x%04x.\n", lines, pid);
bool caption_data_load(const PacketPES_t *pes, CaptionData_t *caption)
CaptionManagementType_t caption_management_get_type(const CaptionManagement_t *management)
@ CAPTION_HANDLER_TYPE_BITMAP
@ CAPTION_HANDLER_TYPE_1BYTE_DRCS
@ CAPTION_HANDLER_TYPE_2BYTE_DRCS
@ CAPTION_HANDLER_TYPE_SYNTHESIZED_SOUND
@ CAPTION_HANDLER_TYPE_GEOMETRIC
bool caption_management_load_unit(const CaptionData_t *caption, unsigned index, CaptionManagement_t *mgmt)
void caption_screen_free(CaptionScreen_t *screen)
bool caption_screen_push_pes(CaptionScreen_t *screen, const uint8_t *pes, size_t len)
CaptionScreen_t * caption_screen_new(CaptionScreenLineCallback_t callback, void *userdata)
void caption_screen_flush(CaptionScreen_t *screen)
struct CaptionScreen_s CaptionScreen_t
CaptionSuperImpose1ByteDrcs_t * caption_superimpose_1bytedrcs_new(const CaptionManagement_t *m)
#define CAPTION_DRCS_MODE_MULTI_GRAD
void caption_superimpose_1bytedrcs_free(CaptionSuperImpose1ByteDrcs_t *cc)
CaptionSuperImpose2ByteDrcs_t * caption_superimpose_2bytedrcs_new(const CaptionManagement_t *m)
void caption_superimpose_bitmap_free(CaptionSuperImposeBitmap_t *cc)
CaptionSuperImposeBitmap_t * caption_superimpose_bitmap_new(const CaptionManagement_t *m)
void caption_superimpose_geometric_free(CaptionSuperImposeGeometric_t *cc)
CaptionSuperImposeGeometric_t * caption_superimpose_geometric_new(const CaptionManagement_t *m)
const char * caption_superimpose_geometric_get_name(uint8_t opcode)
void caption_superimpose_sound_free(CaptionSuperImposeSound_t *cc)
CaptionSuperImposeSound_t * caption_superimpose_sound_new(const CaptionManagement_t *m)
CaptionSuperImpose_t * caption_superimpose_new(const CaptionData_t *caption)
void caption_superimpose_free(CaptionSuperImpose_t *csi)
Main header: includes all the modules of the library.
int main(int argc, char *argv[])
bool packet_pes_load(const uint8_t *pack_raw, const size_t raw_len, PacketPES_t *out)
struct CaptionSuperImpose1ByteDrcs_t * next
CaptionSuperImpose_t * next
const TsPidInfo_t * ts_demux_get_pid_info(const TsDemux_t *demux, uint16_t pid)
void ts_demux_free(TsDemux_t *demux)
const char * ts_demux_describe_pid(const TsDemux_t *demux, uint16_t pid, char *buf, size_t len)
void ts_demux_flush(TsDemux_t *demux)
struct TsDemux_s TsDemux_t
void ts_demux_set_pes_callback(TsDemux_t *demux, uint16_t pid, TsDemuxPesCallback_t callback, void *userdata)
uint16_t ts_demux_get_caption_pid(const TsDemux_t *demux)
TsDemux_t * ts_demux_new(void)
void ts_demux_push(TsDemux_t *demux, const uint8_t *packet)
const uint8_t * ts_reader_next(TsReader_t *reader)
struct TsReader_s TsReader_t
void ts_reader_close(TsReader_t *reader)
TsReader_t * ts_reader_open(const char *filename, TsReaderError_t *error)