Quick-and-dirty documentation for libvo from libmpeg2 0.3.1 Kees Cook 2003-04-17 Basic Usage Pseudocode ---------------------- vo_driver_t * drivers = NULL; vo_open_t * output_open = NULL; vo_instance_t * output = NULL; vo_setup_result_t setup_result; /* find the desired driver */ drivers = vo_drivers(); for (i = 0; drivers && drivers[i].name != NULL; i++) { if (this is the one you want) { output_open = drivers[i].open; break; } } if (!output_open) { blow up: no valid output found } /* open the output driver */ if (!(output = output_open())) { blow up: instance failed to initialize } /* start up decoder */ mpeg2dec=mpeg2_init(); while (data) { const mpeg2_info_t * info; get some data mpeg2_buffer(mpeg2dec,data_start,data_end); info=mpeg2_info(mpeg2dec); switch (mpeg2_parse(mpeg2dec)) { case -1: /* needs more data */ continue; case STATE_SEQUENCE: /* sequence started, so initialize output window */ if (output->setup (output, info->sequence->width, info->sequence->height, &setup_result)) { fprintf (stderr, "display setup failed\n"); exit (1); } /* does the output need to be converted? */ if (setup_result.convert) mpeg2_convert (mpeg2dec, setup_result.convert, NULL); /* can the output provide an fbuf area? */ if (output->set_fbuf) { uint8_t * buf[3]; void * id; mpeg2_custom_fbuf (mpeg2dec, 1); output->set_fbuf (output, buf, &id); mpeg2_set_buf (mpeg2dec, buf, id); output->set_fbuf (output, buf, &id); mpeg2_set_buf (mpeg2dec, buf, id); } else if (output->setup_fbuf) { uint8_t * buf[3]; void * id; output->setup_fbuf (output, buf, &id); mpeg2_set_buf (mpeg2dec, buf, id); output->setup_fbuf (output, buf, &id); mpeg2_set_buf (mpeg2dec, buf, id); output->setup_fbuf (output, buf, &id); mpeg2_set_buf (mpeg2dec, buf, id); } break; case STATE_PICTURE: /* picture is starting */ if (output->set_fbuf) { uint8_t * buf[3]; void * id; output->set_fbuf (output, buf, &id); mpeg2_set_buf (mpeg2dec, buf, id); } if (output->start_fbuf) output->start_fbuf (output, info->current_fbuf->buf, info->current_fbuf->id); break; case STATE_SLICE: case STATE_END: /* draw current picture */ if (info->display_fbuf) { output->draw (output, info->display_fbuf->buf, info->display_fbuf->id); } if (output->discard && info->discard_fbuf) output->discard (output, info->discard_fbuf->buf, info->discard_fbuf->id); break; } } /* shutdown decoder */ mpeg2_close(mpeg2dec); mpeg2dec=NULL; /* close output driver */ if (output && output->close) output->close(output); output=NULL;