int main (int argc, char *argv[]) { krad_sdl_opengl_display_t *krad_opengl_display; krad_vpx_decoder_t *krad_vpx_decoder; kradebml_t *krad_ebml; int len; unsigned char *buffer; buffer = malloc(1000000); krad_vpx_decoder = krad_vpx_decoder_create(); krad_ebml = kradebml_create(); kradebml_open_input_file(krad_ebml, argv[1]); //kradebml_open_input_stream(krad_ebml_player->ebml, "192.168.1.2", 9080, "/teststream.krado"); kradebml_debug(krad_ebml); krad_opengl_display = krad_sdl_opengl_display_create("Krad TEST", 1920, 1080, krad_ebml->vparams.width, krad_ebml->vparams.height); while ((len = kradebml_read_video(krad_ebml, buffer)) > 0) { //printf("got len of %d\n", len); krad_vpx_decoder_decode(krad_vpx_decoder, buffer, len); if (krad_vpx_decoder->img != NULL) { //printf("vpx img: %d %d %d\n", krad_vpx_decoder->img->stride[0], krad_vpx_decoder->img->stride[1], krad_vpx_decoder->img->stride[2]); krad_sdl_opengl_display_render(krad_opengl_display, krad_vpx_decoder->img->planes[0], krad_vpx_decoder->img->stride[0], krad_vpx_decoder->img->planes[1], krad_vpx_decoder->img->stride[1], krad_vpx_decoder->img->planes[2], krad_vpx_decoder->img->stride[2]); krad_sdl_opengl_draw_screen( krad_opengl_display ); usleep(13000); } } free(buffer); krad_vpx_decoder_destroy(krad_vpx_decoder); kradebml_destroy(krad_ebml); krad_sdl_opengl_display_destroy(krad_opengl_display); return 0; }
void kr_udp_recvr (kr_udp_recvr_t *udp_recvr, int port) { krad_rebuilder_t *krad_rebuilder; int sd; int keyframe; int started; int ret; int slen; unsigned char *buffer; unsigned char *packet_buffer; struct sockaddr_in local_address; struct sockaddr_in remote_address; struct SwsContext *scaler; struct pollfd pollfds[4]; scaler = NULL; started = 0; slen = sizeof (remote_address); buffer = calloc (1, 45000); packet_buffer = calloc (1, 2300000); sd = socket (AF_INET, SOCK_DGRAM, 0); krad_rebuilder = krad_rebuilder_create (); memset((char *) &local_address, 0, sizeof(local_address)); local_address.sin_family = AF_INET; local_address.sin_port = htons (port); local_address.sin_addr.s_addr = htonl(INADDR_ANY); if (bind (sd, (struct sockaddr *)&local_address, sizeof(local_address)) == -1 ) { printf("bind error\n"); exit(1); } kr_udp_recvr_alloc_framebuf (udp_recvr); udp_recvr->vpxdec = krad_vpx_decoder_create (); while (1) { if (destroy == 1) { printf ("Got signal!\n"); break; } pollfds[0].fd = kr_wayland_get_fd(udp_recvr->wayland); pollfds[0].events = POLLIN; pollfds[1].fd = sd; pollfds[1].events = POLLIN; ret = poll (pollfds, 2, 1); if (ret < 0) { break; } if (pollfds[0].revents == POLLIN) { kr_wayland_process(udp_recvr->wayland); } if (pollfds[1].revents == POLLIN) { ret = recvfrom (sd, buffer, 2000, 0, (struct sockaddr *)&remote_address, (socklen_t *)&slen); if (ret == -1) { printf("failed recvin udp\n"); exit (1); } //printf ("Received packet from %s:%d\n", // inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port)); krad_rebuilder_write (krad_rebuilder, buffer, ret); ret = krad_rebuilder_read_packet (krad_rebuilder, packet_buffer, 1, &keyframe); if (ret != 0) { //printf ("read a packet with %d bytes key: %d \n", ret, keyframe); if ((started == 1) || ((started == 0) && (keyframe == 1))) { started = 1; } else { continue; } krad_vpx_decoder_decode (udp_recvr->vpxdec, packet_buffer, ret); while (udp_recvr->vpxdec->img != NULL) { int rgb_stride_arr[3] = {4*udp_recvr->width, 0, 0}; uint8_t *dst[4]; scaler = sws_getCachedContext ( scaler, udp_recvr->vpxdec->width, udp_recvr->vpxdec->height, PIX_FMT_YUV420P, udp_recvr->width, udp_recvr->height, PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL); int pos = ((udp_recvr->frames_dec + 1) % udp_recvr->framebufsize) * udp_recvr->frame_size; dst[0] = (unsigned char *)udp_recvr->rgba + pos; sws_scale (scaler, (const uint8_t * const*)udp_recvr->vpxdec->img->planes, udp_recvr->vpxdec->img->stride, 0, udp_recvr->vpxdec->height, dst, rgb_stride_arr); udp_recvr->frames_dec++; //printf ("Received frame!\n"); krad_vpx_decoder_decode_again (udp_recvr->vpxdec); } } } } krad_vpx_decoder_destroy (&udp_recvr->vpxdec); kr_udp_recvr_free_framebuf (udp_recvr); krad_rebuilder_destroy (krad_rebuilder); close (sd); sws_freeContext ( scaler ); free (packet_buffer); free (buffer); }