kr_v4l2s *kr_v4l2s_create(kr_v4l2s_params *params) { kr_v4l2s *v4l2s; kr_v4l2_setup setup; kr_v4l2_mode mode; v4l2s = calloc(1, sizeof(kr_v4l2s)); v4l2s->params = params; v4l2s->mkv = kr_mkv_create_stream(v4l2s->params->host, v4l2s->params->port, v4l2s->params->mount, v4l2s->params->password); if (v4l2s->mkv == NULL) { fprintf(stderr, "failed to stream :/ \n"); exit(1); } v4l2s->vpx_enc = krad_vpx_encoder_create(v4l2s->params->width, v4l2s->params->height, 1000, 1, v4l2s->params->bitrate); kr_mkv_add_video_track(v4l2s->mkv, VP8, v4l2s->params->fps_num, v4l2s->params->fps_den, v4l2s->params->width, v4l2s->params->height); setup.dev = v4l2s->params->device; setup.priority = 0; mode.width = v4l2s->params->width; mode.height = v4l2s->params->height; mode.num = v4l2s->params->fps_num; mode.den = v4l2s->params->fps_den; mode.format = 0; v4l2s->v4l2 = kr_v4l2_create(&setup); kr_v4l2_mode_set(v4l2s->v4l2, &mode); return v4l2s; }
int main() { kr_mkv_t *mkv_output; kr_mkv_t *mkv_input; kr_mkv_t *settings; krad_system_init(); // krad_system_log_on("derp.log"); playlist_t *playlist = playlist_init("test.txt"); mkv_output = kr_mkv_create_stream(argv[1], atoi(argv[2]), argv[3], argv[4]); if(splice_init(settings, mkv_output, playlist) < 0) { perror("splice_init"); } printf("resolution: %d x %d\n", mkv_output->tracks[VIDEO_TRACK].width, mkv_output->tracks[VIDEO_TRACK].height); uint32_t i; while(1) { playlist->current_entry = 0; for(i = 0; i < playlist_count(playlist); i++) { if(playlist_current_video(playlist) > 0) { printf("playing: %s\n", playlist_current_video(playlist)); mkv_input = kr_mkv_open_file(playlist_current_video(playlist)); if(!mkv_input) { perror(playlist_current_video(playlist)); } splice(mkv_input, mkv_output); kr_mkv_destroy(&mkv_input); playlist_next(playlist); } } } kr_mkv_destroy(&mkv_output); playlist_destroy(playlist); return(0); }
krad_container_t *krad_container_create_stream (char *host, uint32_t port, char *mount, char *password) { krad_container_t *container; krad_container_type_t type; type = krad_container_select (mount); if ((type != OGG) && (type != MKV) && (type != KUDP)) { return NULL; } container = calloc (1, sizeof(krad_container_t)); container->type = type; if (container->type == OGG) { //container->ogg = krad_ogg_open_stream (host, port, mount, password); if (container->ogg == NULL) { free (container); return NULL; } } if (container->type == MKV) { container->mkv = kr_mkv_create_stream (host, port, mount, password); if (container->mkv == NULL) { free (container); return NULL; } } if (container->type == KUDP) { container->udp = kr_udp (host, port, mount, password); if (container->udp == NULL) { free (container); return NULL; } } return container; }
kr_streamer_t *kr_streamer_create (kr_streamer_params_t *params) { kr_streamer_t *streamer; uint32_t c; streamer = calloc (1, sizeof(kr_streamer_t)); streamer->params = params; streamer->params->channels = 2; streamer->params->sample_rate = 48000; streamer->client = kr_client_create ("krad streamer client"); if (streamer->client == NULL) { fprintf (stderr, "Could not create KR client.\n"); exit (1); } kr_connect (streamer->client, streamer->params->station); if (!kr_connected (streamer->client)) { fprintf (stderr, "Could not connect to %s krad radio daemon.\n", streamer->params->station); kr_client_destroy (&streamer->client); exit (1); } if (kr_compositor_get_info_wait (streamer->client, &streamer->width, &streamer->height, &streamer->fps_numerator, &streamer->fps_denominator) != 1) { fprintf (stderr, "Could not get compositor info!\n"); kr_client_destroy (&streamer->client); exit (1); } streamer->frame_size = streamer->width * streamer->height * 4; //FIXME streamer->videoport = kr_videoport_create (streamer->client, 0); if (streamer->videoport == NULL) { fprintf (stderr, "Could not make videoport.\n"); kr_client_destroy (&streamer->client); exit (1); } else { printf ("Working!\n"); } kr_videoport_set_callback (streamer->videoport, new_frame, streamer); for (c = 0; c < streamer->params->channels; c++) { streamer->audio_ring[c] = krad_ringbuffer_create (2200000); } if (params->file != NULL) { streamer->mkv = kr_mkv_create_file (params->file); } else { streamer->mkv = kr_mkv_create_stream (streamer->params->host, streamer->params->port, streamer->params->mount, streamer->params->password); } if (streamer->mkv == NULL) { fprintf (stderr, "failed to stream :/ \n"); exit (1); } streamer->vpx_enc = krad_vpx_encoder_create (streamer->params->width, streamer->params->height, streamer->fps_numerator, streamer->fps_denominator, streamer->params->video_bitrate); if (params->file != NULL) { krad_vpx_encoder_set_kf_max_dist (streamer->vpx_enc, 600); } kr_mkv_add_video_track (streamer->mkv, VP8, streamer->fps_numerator, streamer->fps_denominator, streamer->params->width, streamer->params->height); if (kr_mixer_get_info_wait (streamer->client, &streamer->params->sample_rate, NULL) != 1) { fprintf (stderr, "Could not get mixer info!\n"); kr_client_destroy (&streamer->client); exit (1); } streamer->vorbis_enc = krad_vorbis_encoder_create (streamer->params->channels, streamer->params->sample_rate, streamer->params->audio_quality); kr_mkv_add_audio_track (streamer->mkv, VORBIS, streamer->params->sample_rate, streamer->params->channels, streamer->vorbis_enc->hdrdata, 3 + streamer->vorbis_enc->header.sz[0] + streamer->vorbis_enc->header.sz[1] + streamer->vorbis_enc->header.sz[2]); //FIXME streamer->audioport = kr_audioport_create (streamer->client, "streamer2", 0); kr_audioport_set_callback (streamer->audioport, audioport_process, streamer); streamer->frame_ring = krad_ringbuffer_create (90 * sizeof(krad_frame_t *)); streamer->framepool = krad_framepool_create (streamer->width, streamer->height, 8); return streamer; }