Fix speed being 0.5
This commit is contained in:
parent
eb911f4372
commit
0180a4e50e
44
src/main.cpp
44
src/main.cpp
@ -289,21 +289,24 @@ static void receive_frames(AVCodecContext *av_codec_context, AVStream *stream, A
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void receive_frames(AVCodecContext *av_codec_context, AVStream *stream, AVFormatContext *av_format_context) {
|
static void receive_frames(AVCodecContext *av_codec_context, AVStream *stream, AVFormatContext *av_format_context) {
|
||||||
|
AVPacket av_packet;
|
||||||
|
av_init_packet(&av_packet);
|
||||||
for( ; ; ) {
|
for( ; ; ) {
|
||||||
AVPacket *av_packet = new AVPacket;
|
av_packet.data = NULL;
|
||||||
av_init_packet(av_packet);
|
av_packet.size = 0;
|
||||||
av_packet->data = NULL;
|
int res = avcodec_receive_packet(av_codec_context, &av_packet);
|
||||||
av_packet->size = 0;
|
|
||||||
int res = avcodec_receive_packet(av_codec_context, av_packet);
|
|
||||||
if(res == 0) { // we have a packet, send the packet to the muxer
|
if(res == 0) { // we have a packet, send the packet to the muxer
|
||||||
//printf("Received packet!\n");
|
//printf("Received packet!\n");
|
||||||
//printf("data: %p, size: %d, pts: %ld\n", (void*)av_packet->data, av_packet->size, av_packet->pts);
|
//printf("data: %p, size: %d, pts: %ld\n", (void*)av_packet->data, av_packet->size, av_packet->pts);
|
||||||
//printf("timebase: %f\n", ToDouble(stream->time_base));
|
//printf("timebase: %f\n", ToDouble(stream->time_base));
|
||||||
|
|
||||||
av_packet->pts = av_rescale_q_rnd(av_packet->pts, av_codec_context->time_base, stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
|
//av_packet.pts = av_rescale_q_rnd(av_packet.pts, 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.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 = 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->stream_index = stream->index;
|
av_packet_rescale_ts(&av_packet, av_codec_context->time_base, stream->time_base);
|
||||||
|
av_packet.pts /= 2;
|
||||||
|
av_packet.dts /= 2;
|
||||||
|
av_packet.stream_index = stream->index;
|
||||||
//av_packet->stream_index = 0;
|
//av_packet->stream_index = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -313,7 +316,7 @@ static void receive_frames(AVCodecContext *av_codec_context, AVStream *stream, A
|
|||||||
fprintf(stderr, "Failed to write %d bytes to file: %d, %d\n", av_packet->size, written, ferror(output_file));
|
fprintf(stderr, "Failed to write %d bytes to file: %d, %d\n", av_packet->size, written, ferror(output_file));
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if(av_interleaved_write_frame(av_format_context, av_packet) < 0) {
|
if(av_write_frame(av_format_context, &av_packet) < 0) {
|
||||||
fprintf(stderr, "Error: Failed to write frame to muxer\n");
|
fprintf(stderr, "Error: Failed to write frame to muxer\n");
|
||||||
}
|
}
|
||||||
//av_packet_unref(&av_packet);
|
//av_packet_unref(&av_packet);
|
||||||
@ -328,7 +331,7 @@ static void receive_frames(AVCodecContext *av_codec_context, AVStream *stream, A
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//av_packet_unref(&av_packet);
|
av_packet_unref(&av_packet);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -358,7 +361,7 @@ 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 = 400000;
|
codec_context->bit_rate = 4000000;
|
||||||
// Resolution must be a multiple of two
|
// Resolution must be a multiple of two
|
||||||
codec_context->width = 1920;
|
codec_context->width = 1920;
|
||||||
codec_context->height = 1080;
|
codec_context->height = 1080;
|
||||||
@ -375,6 +378,9 @@ static AVStream* add_stream(AVFormatContext *av_format_context, AVCodec **codec,
|
|||||||
codec_context->pix_fmt = AV_PIX_FMT_CUDA;
|
codec_context->pix_fmt = AV_PIX_FMT_CUDA;
|
||||||
if(codec_context->codec_id == AV_CODEC_ID_MPEG1VIDEO)
|
if(codec_context->codec_id == AV_CODEC_ID_MPEG1VIDEO)
|
||||||
codec_context->mb_decision = 2;
|
codec_context->mb_decision = 2;
|
||||||
|
|
||||||
|
//stream->time_base = codec_context->time_base;
|
||||||
|
//codec_context->ticks_per_frame = 30;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -503,10 +509,6 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
|
|
||||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
|
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
|
||||||
|
|
||||||
GLFWwindow *window = glfwCreateWindow(1280, 720, "Hello world", nullptr, nullptr);
|
GLFWwindow *window = glfwCreateWindow(1280, 720, "Hello world", nullptr, nullptr);
|
||||||
@ -517,7 +519,7 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
//glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glewExperimental = GL_TRUE;
|
glewExperimental = GL_TRUE;
|
||||||
GLenum nGlewError = glewInit();
|
GLenum nGlewError = glewInit();
|
||||||
@ -620,11 +622,14 @@ int main(int argc, char **argv) {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//double start_time = glfwGetTime();
|
||||||
|
|
||||||
while(!glfwWindowShouldClose(window)) {
|
while(!glfwWindowShouldClose(window)) {
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
|
||||||
|
// TODO: Use a framebuffer instead. glCopyImageSubData requires opengl 4.2
|
||||||
glCopyImageSubData(
|
glCopyImageSubData(
|
||||||
window_pixmap.texture_id, GL_TEXTURE_2D, 0, 0, 0, 0,
|
window_pixmap.texture_id, GL_TEXTURE_2D, 0, 0, 0, 0,
|
||||||
window_pixmap.target_texture_id, GL_TEXTURE_2D, 0, 0, 0, 0,
|
window_pixmap.target_texture_id, GL_TEXTURE_2D, 0, 0, 0, 0,
|
||||||
@ -649,6 +654,9 @@ int main(int argc, char **argv) {
|
|||||||
cuMemcpy2D(&memcpy_struct);
|
cuMemcpy2D(&memcpy_struct);
|
||||||
//res = cuCtxPopCurrent(&old_ctx);
|
//res = cuCtxPopCurrent(&old_ctx);
|
||||||
|
|
||||||
|
//double time_now = glfwGetTime();
|
||||||
|
//int frame_cc = (time_now - start_time) * 0.66666;
|
||||||
|
//printf("elapsed time: %d\n", frame_cc);
|
||||||
frame->pts = frame_count++;
|
frame->pts = frame_count++;
|
||||||
if(avcodec_send_frame(video_stream->codec, frame) < 0) {
|
if(avcodec_send_frame(video_stream->codec, frame) < 0) {
|
||||||
fprintf(stderr, "Error: avcodec_send_frame failed\n");
|
fprintf(stderr, "Error: avcodec_send_frame failed\n");
|
||||||
@ -975,7 +983,7 @@ int main(int argc, char **argv) {
|
|||||||
avformat_free_context(av_format_context);
|
avformat_free_context(av_format_context);
|
||||||
XDamageDestroy(dpy, xdamage);
|
XDamageDestroy(dpy, xdamage);
|
||||||
#endif
|
#endif
|
||||||
cleanup_window_pixmap(dpy, window_pixmap);
|
//cleanup_window_pixmap(dpy, window_pixmap);
|
||||||
for(int i = 0; i < screen_count; ++i) {
|
for(int i = 0; i < screen_count; ++i) {
|
||||||
XCompositeUnredirectSubwindows(dpy, RootWindow(dpy, i), CompositeRedirectAutomatic);
|
XCompositeUnredirectSubwindows(dpy, RootWindow(dpy, i), CompositeRedirectAutomatic);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user