[ogg-dev] More trival questions

Neil Leathers neil.leathers at rogers.com
Mon Apr 28 17:10:31 PDT 2008


Hopefullly this is once again something trivial I'm missing. I'm still trying to figure out how to pull a part a stream. I get two out the three theora headers I can see in the file (http://v2v.cc/~j/theora_testsuite/320x240.ogg) if I use the buffer in the page struct and nothing usable if I try to use the packet structs. Hopefully this is once again something something trivial I've missed in the documentation.

Neil

>>>
#include <stdio.h>

#include "ogg/ogg.h"

#define BUF_SIZE 4096

int magic_check( unsigned char test, oggpack_buffer* buffer) {
        return (long) test == oggpack_read(buffer, 8);
}

void send_to_my_decoder(unsigned char *body, long body_len) {
        oggpack_buffer buffer;
        long bits_read;

        oggpack_readinit(&buffer, body, body_len);

        bits_read = oggpack_read(&buffer, 8);
        if ( bits_read == 0x80 || bits_read == 0x81 || bits_read == 0x82 ) {

                if ( magic_check( 't', &buffer) &&
                     magic_check( 'h', &buffer) &&
                     magic_check( 'e', &buffer) &&
                     magic_check( 'o', &buffer) &&
                     magic_check( 'r', &buffer) &&
                     magic_check( 'a', &buffer) ) {
                        printf("Magic!\n");
                }
                else {
                        printf("no Magic!\n");
                }
        }
        else {
                printf("not a header\n");
        }
}

int main( int argc, char** argv) {
        ogg_sync_state the_ogg_sync_state;
        ogg_stream_state the_ogg_stream_state;
        ogg_page the_ogg_page;
        ogg_packet the_ogg_packet;
        char* buffer;
        size_t bytes_actually_read;
        FILE* source;

        if (argc < 2) {
                printf("No file\n");
                return 0;
        }

        source = fopen(argv[1], "r");
        if (feof(source) != 0) {
                printf("Empty file\n");
                fclose(source);
                return 0;
        }

        ogg_sync_init(&the_ogg_sync_state);
        ogg_stream_init(&the_ogg_stream_state, 0);

        do {
                if (ogg_sync_pageout(&the_ogg_sync_state, &the_ogg_page) == 1) {
                        printf("Decode Page\n");
                        send_to_my_decoder( the_ogg_page.body, the_ogg_page.body_len );

                        ogg_stream_pagein(&the_ogg_stream_state, &the_ogg_page);

                        ogg_stream_packetout(&the_ogg_stream_state, &the_ogg_packet);

                        printf("Decode Packet\n");
                        send_to_my_decoder( the_ogg_packet.packet, the_ogg_packet.bytes );
                }

                buffer = ogg_sync_buffer(&the_ogg_sync_state, BUF_SIZE);

                bytes_actually_read = fread(buffer, 1, BUF_SIZE, source);

                ogg_sync_wrote(&the_ogg_sync_state, bytes_actually_read);
        } while (feof(source) == 0 );

        ogg_stream_clear( &the_ogg_stream_state );
        ogg_sync_clear( &the_ogg_sync_state );

        fclose(source);

        return 1;
}
>>>

$ ./a.out 320x240.ogg | head -20
Decode Page
Magic!
Decode Packet
not a header
Decode Page
Magic!
Decode Packet
not a header
Decode Page
not a header
Decode Packet
not a header
Decode Page
not a header
Decode Packet
not a header
Decode Page
not a header
Decode Packet
not a header


More information about the ogg-dev mailing list