コード例 #1
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    AVbinFile *file;
    AVbinFileInfo info;
    AVbinResult result;
    const char *fieldNames[] = {"n_streams", "start_time", "duration", "title"};
    mxArray *infoStruct;
    
    if (nrhs != 1)
    {
        mexErrMsgIdAndTxt("avbin:usage", "Usage: info = avbin_file_info(file)");        
        return;
    }
    
    file = (AVbinFile *)*((uint64_t *)mxGetData(prhs[0]));
    
    info.structure_size = sizeof(info);
    
    result = avbin_file_info(file, &info);
    if (result == AVBIN_RESULT_ERROR)
    {
        mexErrMsgIdAndTxt("avbin:failed", "An error occurred");        
        return;
    }
    
    infoStruct = mxCreateStructMatrix(1, 1, sizeof(fieldNames) / sizeof(fieldNames[0]), fieldNames);
    mxSetField(infoStruct, 0, "n_streams", mxCreateDoubleScalar(info.n_streams));
    mxSetField(infoStruct, 0, "start_time", mxCreateDoubleScalar(info.start_time));
    mxSetField(infoStruct, 0, "duration", mxCreateDoubleScalar(info.duration));
    mxSetField(infoStruct, 0, "title", mxCreateString(info.title));
    
    plhs[0] = infoStruct;
}
コード例 #2
0
ファイル: avbin_dump.c プロジェクト: AVbin/AVbin
int main(int argc, char** argv)
{
    if (avbin_init()) 
    {
        printf("Fatal: Couldn't initialize AVbin");
        exit(-1);
    }

    /* To store command-line flags */
    int verbose = 0;       /* -v, --verbose */
    int help = 0;          /* -h, --help */
    char * filename = "";  /* media file to inspect */

    /* Process command-line arguments */
    int i;
    for (i = 1; i < argc; i++)
    {
        if ( (strcmp(argv[i], "-v") == 0) || (strcmp(argv[i], "--verbose") == 0) )
            verbose = 1;
        else if ( (strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0) )
            help = 1;
        else if (strcmp(filename, "") == 0)
            filename = argv[i];
        else
        {
            printf("Invalid argument.  Try --help\n\n");
            exit(-3);
        }
    }

    /* Print help usage and exit, if that's what was selected */
    if (help)
    {
        printf("Usage: avbin_dump [options] [filename]\n\n  -h, --help     Print this help message.\n  -v, --verbose  Run through each packet in the media file and print out some info.\n\n");
        exit(0);
    }

    AVbinInfo *info =  avbin_get_info();

    printf("AVbin %s (feature version %d) built on %s\n  Repo: %s\n  Commit: %s\n\n",
           info->version_string,
           info->version,
           info->build_date,
           info->repo,
           info->commit);

    printf("Backend: %s %s\n  Repo: %s\n  Commit: %s\n\n",
           info->backend,
           info->backend_version_string,
           info->repo,
           info->backend_commit);

    if ( strcmp(filename, "") == 0 ) 
    {
        printf("If you specify a media file, we will print information about it, for example:\n./avbin_dump some_file.mp3\n");
        exit(-1);
    }

    AVbinFile* file = avbin_open_filename(filename);
    if (!file) 
    {
        printf("Unable to open file '%s'\n", filename);
        exit(-1);
    }

    AVbinFileInfo fileinfo;
    fileinfo.structure_size = sizeof(fileinfo);

    if (avbin_file_info(file, &fileinfo)) 
        exit(-2);

    printf("#streams %d\n",fileinfo.n_streams);
    printf("start time %" PRId64 "\n", fileinfo.start_time);
    printf("duration %lldus (%lld:%02lld:%02lld)\n",
        fileinfo.duration,
        fileinfo.duration / (1000000L * 60 * 60),
        (fileinfo.duration / (1000000L * 60)) % 60,
        (fileinfo.duration / 1000000L) % 60);

    printf("Title: %s\n", fileinfo.title);
    printf("Author: %s\n", fileinfo.author);
    printf("Copyright: %s\n", fileinfo.copyright);
    printf("Comment: %s\n", fileinfo.comment);
    printf("Album: %s\n", fileinfo.album);
    printf("Track: %d\n", fileinfo.track);
    printf("Year: %d\n", fileinfo.year);
    printf("Genre: %s\n", fileinfo.genre);

    AVbinStream* video_stream = NULL;
    AVbinStream* audio_stream = NULL;
    int video_stream_index = -1;
    int audio_stream_index = -1;
    int width, height;

    int stream_index;
    for (stream_index=0; stream_index<fileinfo.n_streams; stream_index++)
    {
        AVbinStreamInfo8 streaminfo;
        streaminfo.structure_size = sizeof(streaminfo);

        avbin_stream_info(file, stream_index, (AVbinStreamInfo *) &streaminfo);

        if (streaminfo.type == AVBIN_STREAM_TYPE_VIDEO)
        {
            printf("video stream at %d, height %d, width %d\n",stream_index,streaminfo.video.height,streaminfo.video.width);
            width = streaminfo.video.width;
            height = streaminfo.video.height;
            video_stream_index = stream_index;
            video_stream = avbin_open_stream(file, stream_index);
        }
        if (streaminfo.type == AVBIN_STREAM_TYPE_AUDIO)
        {
            printf("audio stream at %d, rate %d, bits %d, chan %d\n",stream_index,streaminfo.audio.sample_rate,streaminfo.audio.sample_bits,streaminfo.audio.channels);
            audio_stream_index = stream_index;
            audio_stream = avbin_open_stream(file, stream_index);
        }
    }

    if (!verbose)
        exit(0);

    AVbinPacket packet;
    packet.structure_size = sizeof(packet);

    while (!avbin_read(file, &packet))
    {
        if (packet.stream_index == video_stream_index)
        {
            uint8_t* video_buffer = (uint8_t*) malloc(width*height*3);
            if (avbin_decode_video(video_stream, packet.data, packet.size,video_buffer)<=0) printf("could not read video packet\n");
            else printf("read video frame\n");

            // do something with video_buffer

            free(video_buffer);
        }
        if (packet.stream_index == audio_stream_index)
        {
            uint8_t audio_buffer[1024*1024];
            int bytesleft = sizeof(audio_buffer);
            int bytesout = bytesleft;
            int bytesread;
            uint8_t* audio_data = audio_buffer;
            while ((bytesread = avbin_decode_audio(audio_stream, packet.data, packet.size, audio_data, &bytesout)) > 0)
            {
                packet.data += bytesread;
                packet.size -= bytesread;
                audio_data += bytesout;
                bytesleft -= bytesout;
                bytesout = bytesleft;
            }

            int nrBytes = audio_data-audio_buffer;

            printf("[%" PRId64 "] read audio packet of size %d bytes\n", packet.timestamp, nrBytes);

            // do something with audio_buffer ... but don't free it since it is a local array
        }
    }

    if (video_stream) avbin_close_stream(video_stream);
    if (audio_stream) avbin_close_stream(audio_stream);

    avbin_close_file(file);
}