Blob Blame History Raw
/*
 * This file is part of libbluray
 * Copyright (C) 2009-2010  John Stebbins
 *
 * 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
 * <http://www.gnu.org/licenses/>.
 */

#include "bluray.h"

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>

#define OPTS "ahs:l"

static void _usage(char *cmd)
{
    fprintf(stderr,
"%s <BD base dir> [-s <seconds>]\n"
"   List the titles and title info of a BD\n"
"   -s #    - Filter out titles shorter than # seconds\n"
"   -a      - List all titles\n"
"   -l      - Show language codes\n"
"   -h      - This message\n",
        cmd
    );
    exit(EXIT_FAILURE);
}

static void _print_langs(const char *tag, const BLURAY_STREAM_INFO *si, int count)
{
    int ii;
    printf("\t%s: ", tag);
    for (ii = 0; ii < count; ii++) {
        printf("%3.3s ", si[ii].lang);
    }
    printf("\n");
}

static void _dump_langs(const BLURAY_CLIP_INFO *ci)
{
    if (ci->audio_streams) {
        _print_langs("AUD",  ci->audio_streams, ci->audio_stream_count);
    }
    if (ci->pg_streams) {
        _print_langs("PG ",  ci->pg_streams,    ci->pg_stream_count);
    }
}

int main(int argc, char *argv[])
{
    BLURAY *bd;
    int count, ii, opt, main_title;
    unsigned int seconds = 0, langs = 0;
    unsigned int flags = TITLES_RELEVANT;
    char *bd_dir = NULL;

    do
    {
        opt = getopt(argc, argv, OPTS);
        switch (opt)
        {
            case -1:
                if (optind < argc && bd_dir == NULL)
                {
                    bd_dir = argv[optind];
                    optind++;
                    opt = 1;
                }
                break;
            case 'a':
                flags = TITLES_ALL;
                break;
            case 's':
                seconds = strtol(optarg, NULL, 0);
                break;
            case 'l':
                langs = 1;
                break;
            case 'h':
            default:
                _usage(argv[0]);
                break;
        }
    } while (opt != -1);

    if (bd_dir == NULL)
    {
        _usage(argv[0]);
    }
    bd = bd_open(bd_dir, NULL);
    if (!bd) {
        fprintf(stderr, "bd_open(%s) failed\n", bd_dir);
        exit(EXIT_FAILURE);
    }
    count = bd_get_titles(bd, flags, seconds);
    main_title = bd_get_main_title(bd);
    if (main_title >= 0) {
        printf("Main title: %d\n", main_title + 1);
    }
    for (ii = 0; ii < count; ii++)
    {
        BLURAY_TITLE_INFO* ti;
        ti = bd_get_title_info(bd, ii, 0);
        printf(
       "index: %3d duration: %02"PRIu64":%02"PRIu64":%02"PRIu64" chapters: %3d angles: %2u clips: %3u (playlist: %05d.mpls) "
       "V:%d A:%-2d PG:%-2d IG:%-2d SV:%d SA:%d\n",
              ii + 1,
              (ti->duration / 90000) / (3600),
              ((ti->duration / 90000) % 3600) / 60,
              ((ti->duration / 90000) % 60),
              ti->chapter_count, ti->angle_count, ti->clip_count, ti->playlist,
              ti->clips[0].video_stream_count,
              ti->clips[0].audio_stream_count,
              ti->clips[0].pg_stream_count,
              ti->clips[0].ig_stream_count,
              ti->clips[0].sec_video_stream_count,
              ti->clips[0].sec_audio_stream_count
        );
        if (langs) {
            _dump_langs(&ti->clips[0]);
        }
        bd_free_title_info(ti);
    }
    bd_close(bd);
    return 0;
}