/*
* This file is part of libbdplus
* Copyright (C) 2008-2010 Accident
* Copyright (C) 2013 VideoLAN
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* .
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include "libbdplus/bdplus.h"
#include
#include
#include
#include
#ifdef HAVE_LIBAACS
#include
#endif
static uint8_t _hex_byte(char c)
{
if (c >= '0' && c <= '9') {
return c - '0';
}
else if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
}
else if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
}
else {
fprintf(stderr, "invalid char in hex string: 0x%02X (%c)\n", c, c);
exit(1);
}
return 0;
}
static void _libaacs_get_vid(uint8_t *vid, uint8_t *mk, const char *root)
{
#ifndef HAVE_LIBAACS
fprintf(stderr, "libaacs support not enabled. Please provide VID in command line.\n");
exit(1);
#else
AACS *aacs = aacs_open(root, NULL);
unsigned ii;
if (!aacs) {
fprintf(stderr, "aacs_open() failed. Please provide VID in command line.\n");
exit(1);
}
const uint8_t *aacs_vid = aacs_get_vid(aacs);
if (!aacs_vid) {
fprintf(stderr, "aacs_get_vid() failed. Please provide VID in command line.\n");
aacs_close(aacs);
exit(1);
}
memcpy(vid, aacs_vid, 16);
const uint8_t *aacs_mk = aacs_get_mk(aacs);
if (!aacs_vid) {
fprintf(stderr, "aacs_get_mk() failed.\n");
aacs_close(aacs);
exit(1);
}
memcpy(mk, aacs_mk, 16);
aacs_close(aacs);
printf("got vid from libaacs: ");
for (ii = 0; ii < 16; ii++) {
printf("%02X", vid[ii]);
}
printf("\n");
#endif
}
int main(int argc, char **argv)
{
uint8_t vid[16], mk[16] = {0};
unsigned ii;
if (argc < 2) {
fprintf(stderr, "%s /path/tobluray [VID]\r\n", argv[0]);
fprintf(stderr, "Where we expect to find /path/tobluray/BDSVM/\r\n");
exit(1);
}
if (argc < 3) {
_libaacs_get_vid(vid, mk, argv[1]);
} else {
for (ii = 0; ii < 16; ii++) {
vid[ii] = (_hex_byte(argv[2][2*ii]) << 4) | _hex_byte(argv[2][2*ii + 1]);
}
}
printf("Opening bdplus ...\n");
bdplus_t *bd = bdplus_init(argv[1], NULL, vid);
if (!bd) {
fprintf(stderr, "bdplus_init() failed\n");
exit(1);
}
int dd = bdplus_get_code_date(bd);
printf("BD+ content code generation %d (released %d-%02d-%02d)\n\n",
bdplus_get_code_gen(bd), dd >> 16, (dd >> 8) & 0xff, dd & 0xff);
bdplus_set_mk(bd, mk);
if (bdplus_start(bd) < 0) {
fprintf(stderr, "bdplus_start() failed\n");
}
/* Try to get conversion table without actually playing the disc. */
bdplus_event(bd, BDPLUS_RUN_CONVTAB, 32, 0);
for (ii = 0; ii < 32; ii++) {
bdplus_event(bd, BDPLUS_EVENT_TITLE, ii, 0);
}
for (ii = 0; ii < 32; ii++) {
bdplus_st_t *st = bdplus_m2ts(bd, ii);
if (st) {
printf("BD+ active for %05d.m2ts\n", ii);
bdplus_m2ts_close(st);
}
}
printf("Cleaning up...\n");
bdplus_free(bd);
exit(0);
}