// 函数实现 void* render_open(int adevtype, int srate, AVSampleFormat sndfmt, int64_t ch_layout, int vdevtype, void *surface, AVRational frate, AVPixelFormat pixfmt, int w, int h) { RENDER *render = (RENDER*)calloc(1, sizeof(RENDER)); if (!render) { av_log(NULL, AV_LOG_ERROR, "failed to allocate render context !\n"); exit(0); } // init for video render->video_width = w; render->video_height = h; render->render_wnew = w; render->render_hnew = h; render->frame_rate = frate; render->pixel_fmt = pixfmt; if (render->pixel_fmt == AV_PIX_FMT_NONE) { render->pixel_fmt = AV_PIX_FMT_YUV420P; } // init for audio render->sample_rate = srate; render->sample_fmt = sndfmt; render->chan_layout = ch_layout; // init for visual effect #if CONFIG_ENABLE_VEFFECT render->veffect_context = veffect_create(surface); pthread_create(&render->veffect_thread, NULL, render_veffect_thread, render); #endif // create adev & vdev render->adev = adev_create(adevtype, 0, (int)((double)ADEV_SAMPLE_RATE * frate.den / frate.num + 0.5) * 4); render->vdev = vdev_create(vdevtype, surface, 0, w, h, (int)((double)frate.num / frate.den + 0.5)); // make adev & vdev sync together int64_t *papts = NULL; vdev_getavpts(render->vdev, &papts, NULL); adev_syncapts(render->adev, papts); #ifdef WIN32 RECT rect; GetClientRect((HWND)surface, &rect); render_setrect(render, 0, rect.left, rect.top, rect.right, rect.bottom); render_setrect(render, 1, rect.left, rect.top, rect.right, rect.bottom); #endif // set default playback speed render_setspeed(render, 100); return render; }
// 函数实现 void* render_open(void *surface, AVRational frate, int pixfmt, int w, int h, int srate, AVSampleFormat sndfmt, int64_t ch_layout) { RENDER *render = (RENDER*)malloc(sizeof(RENDER)); if (!render) { log_printf(TEXT("failed to allocate render context !\n")); exit(0); } // clear it first memset(render, 0, sizeof(RENDER)); // init for video render->nVideoWidth = w; render->nVideoHeight = h; render->nFramePeriod = 1000 * frate.den / frate.num; render->FrameRate = frate; render->PixelFormat = (AVPixelFormat)pixfmt; // init for audio render->nSampleRate = srate; render->SampleFormat = sndfmt; render->nChanLayout = ch_layout; // create adev & vdev render->adev = adev_create(0, (int)(44100.0 * frate.den / frate.num + 0.5) * 4); render->vdev = vdev_create(surface, 0, 0, 0, frate.num / frate.den); // make adev & vdev sync together int64_t *papts = NULL; vdev_getavpts(render->vdev, &papts, NULL); adev_syncapts(render->adev, papts); RECT rect; GetClientRect((HWND)surface, &rect); render_setrect (render, rect.left, rect.top, rect.right, rect.bottom); render_setspeed(render, 100); return render; }