Use window resolution
This commit is contained in:
parent
0180a4e50e
commit
bcb79582c5
22
src/main.cpp
22
src/main.cpp
@ -101,6 +101,8 @@ static bool recreate_window_pixmap(Display *dpy, Window window_id, WindowPixmap
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Note that mipmap is generated even though its not used.
|
||||||
|
// glCopyImageSubData fails if the texture doesn't have mipmap.
|
||||||
const int pixmap_attribs[] = {
|
const int pixmap_attribs[] = {
|
||||||
GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
|
GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
|
||||||
GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT,
|
GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT,
|
||||||
@ -149,6 +151,10 @@ static bool recreate_window_pixmap(Display *dpy, Window window_id, WindowPixmap
|
|||||||
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
printf("texture width: %d, height: %d\n", pixmap.texture_width, pixmap.texture_height);
|
printf("texture width: %d, height: %d\n", pixmap.texture_width, pixmap.texture_height);
|
||||||
|
|
||||||
|
// Generating this second texture is needed because cuGraphicsGLRegisterImage
|
||||||
|
// cant be used with the texture that is mapped directly to the pixmap.
|
||||||
|
// TODO: Investigate if it's somehow possible to use the pixmap texture directly,
|
||||||
|
// this should improve performance since only less image copy is then needed every frame.
|
||||||
glGenTextures(1, &pixmap.target_texture_id);
|
glGenTextures(1, &pixmap.target_texture_id);
|
||||||
glBindTexture(GL_TEXTURE_2D, pixmap.target_texture_id);
|
glBindTexture(GL_TEXTURE_2D, pixmap.target_texture_id);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixmap.texture_width, pixmap.texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixmap.texture_width, pixmap.texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
@ -304,8 +310,8 @@ static void receive_frames(AVCodecContext *av_codec_context, AVStream *stream, A
|
|||||||
//av_packet.dts = av_rescale_q_rnd(av_packet.dts, av_codec_context->time_base, stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
|
//av_packet.dts = av_rescale_q_rnd(av_packet.dts, av_codec_context->time_base, stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
|
||||||
//av_packet.duration = 60;//av_rescale_q(av_packet->duration, av_codec_context->time_base, stream->time_base);
|
//av_packet.duration = 60;//av_rescale_q(av_packet->duration, av_codec_context->time_base, stream->time_base);
|
||||||
av_packet_rescale_ts(&av_packet, av_codec_context->time_base, stream->time_base);
|
av_packet_rescale_ts(&av_packet, av_codec_context->time_base, stream->time_base);
|
||||||
av_packet.pts /= 2;
|
//av_packet.pts /= 2;
|
||||||
av_packet.dts /= 2;
|
//av_packet.dts /= 2;
|
||||||
av_packet.stream_index = stream->index;
|
av_packet.stream_index = stream->index;
|
||||||
//av_packet->stream_index = 0;
|
//av_packet->stream_index = 0;
|
||||||
|
|
||||||
@ -335,7 +341,7 @@ static void receive_frames(AVCodecContext *av_codec_context, AVStream *stream, A
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static AVStream* add_stream(AVFormatContext *av_format_context, AVCodec **codec, enum AVCodecID codec_id) {
|
static AVStream* add_stream(AVFormatContext *av_format_context, AVCodec **codec, enum AVCodecID codec_id, const WindowPixmap &window_pixmap) {
|
||||||
//*codec = avcodec_find_encoder(codec_id);
|
//*codec = avcodec_find_encoder(codec_id);
|
||||||
*codec = avcodec_find_encoder_by_name("h264_nvenc");
|
*codec = avcodec_find_encoder_by_name("h264_nvenc");
|
||||||
if(!*codec) {
|
if(!*codec) {
|
||||||
@ -361,10 +367,10 @@ static AVStream* add_stream(AVFormatContext *av_format_context, AVCodec **codec,
|
|||||||
}
|
}
|
||||||
case AVMEDIA_TYPE_VIDEO: {
|
case AVMEDIA_TYPE_VIDEO: {
|
||||||
codec_context->codec_id = codec_id;
|
codec_context->codec_id = codec_id;
|
||||||
codec_context->bit_rate = 4000000;
|
codec_context->bit_rate = 8000000;
|
||||||
// Resolution must be a multiple of two
|
// Resolution must be a multiple of two
|
||||||
codec_context->width = 1920;
|
codec_context->width = window_pixmap.texture_width & ~1;
|
||||||
codec_context->height = 1080;
|
codec_context->height = window_pixmap.texture_height & ~1;
|
||||||
// Timebase: This is the fundamental unit of time (in seconds) in terms of
|
// Timebase: This is the fundamental unit of time (in seconds) in terms of
|
||||||
// which frame timestamps are represented. For fixed-fps content,
|
// which frame timestamps are represented. For fixed-fps content,
|
||||||
// timebase should be 1/framerate and timestamp increments should be identical to 1
|
// timebase should be 1/framerate and timestamp increments should be identical to 1
|
||||||
@ -519,7 +525,7 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(0);
|
||||||
|
|
||||||
glewExperimental = GL_TRUE;
|
glewExperimental = GL_TRUE;
|
||||||
GLenum nGlewError = glewInit();
|
GLenum nGlewError = glewInit();
|
||||||
@ -549,7 +555,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
AVOutputFormat *output_format = av_format_context->oformat;
|
AVOutputFormat *output_format = av_format_context->oformat;
|
||||||
AVCodec *video_codec;
|
AVCodec *video_codec;
|
||||||
AVStream *video_stream = add_stream(av_format_context, &video_codec, output_format->video_codec);
|
AVStream *video_stream = add_stream(av_format_context, &video_codec, output_format->video_codec, window_pixmap);
|
||||||
if(!video_stream) {
|
if(!video_stream) {
|
||||||
fprintf(stderr, "Error: Failed to create video stream\n");
|
fprintf(stderr, "Error: Failed to create video stream\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user