예제 #1
0
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
{
    CDIOContext *s = ctx->priv_data;
    int ret;
    uint16_t *buf;
    char *err = NULL;

    if (ctx->streams[0]->cur_dts > s->last_sector)
        return AVERROR_EOF;

    buf = cdio_paranoia_read(s->paranoia, NULL);
    if (!buf)
        return AVERROR_EOF;

    if (err = cdio_cddap_errors(s->drive)) {
        av_log(ctx, AV_LOG_ERROR, "%s\n", err);
        free(err);
        err = NULL;
    }
    if (err = cdio_cddap_messages(s->drive)) {
        av_log(ctx, AV_LOG_VERBOSE, "%s\n", err);
        free(err);
        err = NULL;
    }

    if ((ret = av_new_packet(pkt, CDIO_CD_FRAMESIZE_RAW)) < 0)
        return ret;
    memcpy(pkt->data, buf, CDIO_CD_FRAMESIZE_RAW);
    return 0;
}
예제 #2
0
static int cdpa_read(rnc_dev_t *dev, void *buf, size_t size)
{
    cdpa_t *cdpa = dev->data;
    char   *s, *p;
    size_t  n;

    mrp_debug("reading %zu bytes", size);

    if ((size % CDIO_CD_FRAMESIZE_RAW) != 0)
        goto invalid;

    p = buf;
    n = size;
    while (n > 0) {
        s = (char *)cdio_paranoia_read(cdpa->cdpa, read_status);

        if (s == NULL)
            goto ioerror;

        memcpy(p, s, CDIO_CD_FRAMESIZE_RAW);
        p +=  CDIO_CD_FRAMESIZE_RAW;
        n -=  CDIO_CD_FRAMESIZE_RAW;
    }

    return size;

 invalid:
    errno = EINVAL;
    return -1;

 ioerror:
    errno = EIO;
    return -1;
}
예제 #3
0
		int RipAttempt() {
			for ( i_cursor = i_first_lsn; i_cursor <= i_last_lsn; ) {
				for ( int i = 0; i < NUM_TRIES; i++) {
					paranoia_seek(p, i_cursor, SEEK_SET);
					for ( int j = 0; j < NUM_SECTORS && j <= (i_last_lsn - i_cursor); j++ ) {
						/* read a sector */
						int16_t *p_readbuf = cdio_paranoia_read(p, NULL);
						int16_t *buf_pointer;
						psz_err = cdio_cddap_errors(d);
						psz_mes = cdio_cddap_messages(d);
						if (psz_mes || psz_err)
							printf("%s%s\n", psz_mes ? psz_mes: "", psz_err ? psz_err: "");
						if (psz_err) free(psz_err);
						if (psz_mes) free(psz_mes);
						if( !p_readbuf ) {
							printf("paranoia read error. Stopping.\n");
							break;
						} else {
							/* Transport data to actual buffer */
							if ( i == 0 ) {
								for ( buf_pointer = p_readbuf, counter = (CDIO_CD_FRAMESIZE_RAW/2)*j; buf_pointer != NULL && counter < (CDIO_CD_FRAMESIZE_RAW/2)*(j+1); buf_pointer++, counter++ ) {
									readbuf[counter] = *buf_pointer;
								}
							} else {
								for ( buf_pointer = p_readbuf, counter = (CDIO_CD_FRAMESIZE_RAW/2)*j; buf_pointer != NULL && counter < (CDIO_CD_FRAMESIZE_RAW/2)*(j+1); buf_pointer++, counter++ ) {
									readbuf2[counter] = *buf_pointer;
								}
							}
						}
						num_samples = counter;
					}
				}
				failed = false;
				for (int i = 0; i < num_samples ; i++) {
					if (readbuf[i] != readbuf2[i]) {
						failed = true;
					}
				}
				if (!failed) {
					i_cursor += NUM_SECTORS;
					written_samples = WriteToFile();
					if (written_samples != num_samples) return 1;
				}
			}
			return 0;
		}
예제 #4
0
파일: ripncode.c 프로젝트: klihub/ripncode
static void get_track_info(ripncode_t *r)
{
    rip_track_t *t;
    int          i, base;
    char         file[1024], *msg;
    int16_t     *samples;
    int          fd, n, l, total;

    base      = cdio_get_first_track_num(r->cdio);
    r->ntrack = cdio_get_num_tracks(r->cdio);
    r->tracks = mrp_allocz_array(rip_track_t, r->ntrack);

    if (r->tracks == NULL && r->ntrack > 0)
        ripncode_fatal(r, "failed to allocate track info");

    cdio_paranoia_modeset(r->cdpa, PARANOIA_MODE_FULL);

    for (i = 0, t = r->tracks; i < r->ntrack; i++, t++) {
        if (i >= r->last)
            break;
        t->id      = base + i;
        t->format  = cdio_get_track_format(r->cdio, base + i);
        t->lsn_beg = cdio_get_track_lsn(r->cdio, base + i);
        t->lsn_end = cdio_get_track_last_lsn(r->cdio, base + i);
        t->lba     = cdio_get_track_lba(r->cdio, base + i);

        printf("track #%d (id %d): lsn: %u - %u (lba %u), format: %s\n",
               i, base + i, t->lsn_beg, t->lsn_end, t->lba,
               track_format_name(t->format));

        if (r->dryrun)
            continue;

        snprintf(file, sizeof(file), "track-%d.raw", i);
        if ((fd = open(file, O_WRONLY|O_CREAT, 0644)) < 0)
            ripncode_fatal(r, "failed to open '%s' (%d: %s)", file,
                           errno, strerror(errno));

        cdio_paranoia_seek(r->cdpa, t->lsn_beg * CDIO_CD_FRAMESIZE_RAW,
                           SEEK_SET);

        total = t->lsn_end - t->lsn_beg + 1;
        for (l = 0; l <= total; l++) {
            printf("\rreading track sector %d/%d (#%d)...", l, total,
                   t->lsn_beg + l);
            fflush(stdout);

            samples = cdio_paranoia_read(r->cdpa, read_status);

            if (samples == NULL) {
                msg = cdio_cddap_errors(r->cdda);
                ripncode_fatal(r, "failed to seek to LSN %d (%s)", t->lsn_beg,
                               msg ? msg : "unknown error");
            }

            n = write(fd, samples, CDIO_CD_FRAMESIZE_RAW);

            if (n < 0)
                ripncode_fatal(r, "failed to write sector data (%d: %s)",
                               errno, strerror(errno));
        }

        close(fd);
    }
}