static int read_header(AVFormatContext *avctx, AVFormatParameters *ap) { TtyDemuxContext *s = avctx->priv_data; AVStream *st = av_new_stream(avctx, 0); if (!st) return AVERROR(ENOMEM); st->codec->codec_tag = 0; st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = CODEC_ID_ANSI; if (ap->width) st->codec->width = ap->width; if (ap->height) st->codec->height = ap->height; if (!ap->time_base.num) { av_set_pts_info(st, 60, 1, 25); } else { av_set_pts_info(st, 60, ap->time_base.num, ap->time_base.den); } /* simulate tty display speed */ s->chars_per_frame = FFMAX(av_q2d(st->time_base) * (ap->sample_rate ? ap->sample_rate : LINE_RATE), 1); if (!url_is_streamed(avctx->pb)) { s->fsize = url_fsize(avctx->pb); st->duration = (s->fsize + s->chars_per_frame - 1) / s->chars_per_frame; if (ff_sauce_read(avctx, &s->fsize, 0, 0) < 0) efi_read(avctx, s->fsize - 51); url_fseek(avctx->pb, 0, SEEK_SET); } return 0; }
/* * Read EFI - return partition number upon success. */ int efi_alloc_and_read(int fd, struct dk_gpt **vtoc) { int rval; uint32_t nparts; int length; /* figure out the number of entries that would fit into 16K */ nparts = EFI_MIN_ARRAY_SIZE / sizeof (efi_gpe_t); length = (int) sizeof (struct dk_gpt) + (int) sizeof (struct dk_part) * (nparts - 1); if ((*vtoc = calloc(length, 1)) == NULL) return (VT_ERROR); (*vtoc)->efi_nparts = nparts; rval = efi_read(fd, *vtoc); if ((rval == VT_EINVAL) && (*vtoc)->efi_nparts > nparts) { void *tmp; length = (int) sizeof (struct dk_gpt) + (int) sizeof (struct dk_part) * ((*vtoc)->efi_nparts - 1); nparts = (*vtoc)->efi_nparts; if ((tmp = realloc(*vtoc, length)) == NULL) { free (*vtoc); *vtoc = NULL; return (VT_ERROR); } else { *vtoc = tmp; rval = efi_read(fd, *vtoc); } } if (rval < 0) { if (efi_debug) { (void) fprintf(stderr, "read of EFI table failed, rval=%d\n", rval); } free (*vtoc); *vtoc = NULL; } return (rval); }