X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=h264encode.cpp;h=78e34474b80e07a397c41dbaf3a0cf70d1807a3d;hb=d3a801a9148345bec24f21e1184f7e97f53040b2;hp=d5c9e8c9e70a905cb4bef7ee53144e3c1aa91836;hpb=6afdb5d6c2a5949fcd956afbd0a2f8f2699587ed;p=nageru diff --git a/h264encode.cpp b/h264encode.cpp index d5c9e8c..78e3447 100644 --- a/h264encode.cpp +++ b/h264encode.cpp @@ -110,7 +110,7 @@ class H264EncoderImpl { public: H264EncoderImpl(QSurface *surface, int width, int height, HTTPD *httpd); ~H264EncoderImpl(); - void add_audio(int64_t pts, vector audio); // Needs to come before end_frame() of same pts. + void add_audio(int64_t pts, vector audio); bool begin_frame(GLuint *y_tex, GLuint *cbcr_tex); void end_frame(RefCountedGLsync fence, int64_t pts, const vector &input_frames); void shutdown(); @@ -293,7 +293,11 @@ bitstream_put_ui(bitstream *bs, unsigned int val, int size_in_bits) bs->buffer[pos] = (bs->buffer[pos] << size_in_bits | val); } else { size_in_bits -= bit_left; - bs->buffer[pos] = (bs->buffer[pos] << bit_left) | (val >> size_in_bits); + if (bit_left >= 32) { + bs->buffer[pos] = (val >> size_in_bits); + } else { + bs->buffer[pos] = (bs->buffer[pos] << bit_left) | (val >> size_in_bits); + } bs->buffer[pos] = va_swap32(bs->buffer[pos]); if (pos + 1 == bs->max_size_in_dword) { @@ -1440,7 +1444,7 @@ void H264EncoderImpl::save_codeddata(storage_task task) string data; - const int64_t global_delay = (ip_period - 1) * (TIMEBASE / MAX_FPS); // So we never get negative dts. + const int64_t global_delay = int64_t(ip_period - 1) * (TIMEBASE / MAX_FPS); // So we never get negative dts. va_status = vaMapBuffer(va_dpy, gl_surfaces[task.display_order % SURFACE_NUM].coded_buf, (void **)(&buf_list)); CHECK_VASTATUS(va_status, "vaMapBuffer");