summaryrefslogtreecommitdiff
path: root/src/rmd_encode_image_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rmd_encode_image_buffer.c')
-rw-r--r--src/rmd_encode_image_buffer.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/rmd_encode_image_buffer.c b/src/rmd_encode_image_buffer.c
index d83c694..5b08620 100644
--- a/src/rmd_encode_image_buffer.c
+++ b/src/rmd_encode_image_buffer.c
@@ -95,7 +95,7 @@ void *rmdEncodeImageBuffer(ProgData *pdata) {
//this function is meant to be called normally
//not through a thread of it's own
-void rmdSyncEncodeImageBuffer(ProgData *pdata) {
+void rmdSyncEncodeImageBuffer(ProgData *pdata, unsigned int n_frames) {
EncData *enc_data = pdata->enc_data;
if (theora_encode_YUVin(&enc_data->m_th_st, &enc_data->yuv)) {
@@ -103,14 +103,23 @@ void rmdSyncEncodeImageBuffer(ProgData *pdata) {
return;
}
- if (theora_encode_packetout(&enc_data->m_th_st, !pdata->running, &enc_data->m_ogg_pckt1) == 1) {
+ if (n_frames > 1)
+ theora_control( &enc_data->m_th_st,
+ TH_ENCCTL_SET_DUP_COUNT,
+ (void *)&(int){n_frames - 1},
+ sizeof(int));
+
+ while (theora_encode_packetout(&enc_data->m_th_st, 0, &enc_data->m_ogg_pckt1) > 0) {
pthread_mutex_lock(&pdata->libogg_mutex);
ogg_stream_packetin(&enc_data->m_ogg_ts, &enc_data->m_ogg_pckt1);
-
+ /* TODO: this is the only real difference from what's open-coded above,
+ * investigate why this is done this way and make the thread just call
+ * this function instead of duplicating it.
+ */
if (!pdata->running)
enc_data->m_ogg_ts.e_o_s = 1;
-
- pdata->avd += pdata->frametime;
pthread_mutex_unlock(&pdata->libogg_mutex);
}
+
+ pdata->avd += pdata->frametime * n_frames;
}
© All Rights Reserved