diff options
-rw-r--r-- | toxav/video.c | 71 | ||||
-rw-r--r-- | toxcore/group.c | 12 |
2 files changed, 39 insertions, 44 deletions
diff --git a/toxav/video.c b/toxav/video.c index 5145c29c..17969003 100644 --- a/toxav/video.c +++ b/toxav/video.c | |||
@@ -299,55 +299,52 @@ void vc_iterate(VCSession *vc) | |||
299 | return; | 299 | return; |
300 | } | 300 | } |
301 | 301 | ||
302 | pthread_mutex_lock(vc->queue_mutex); | ||
303 | |||
302 | struct RTPMessage *p; | 304 | struct RTPMessage *p; |
303 | 305 | ||
304 | vpx_codec_err_t rc; | 306 | if (!rb_read((RingBuffer *)vc->vbuf_raw, (void **)&p)) { |
307 | LOGGER_TRACE(vc->log, "no Video frame data available"); | ||
308 | pthread_mutex_unlock(vc->queue_mutex); | ||
309 | return; | ||
310 | } | ||
305 | 311 | ||
306 | pthread_mutex_lock(vc->queue_mutex); | 312 | pthread_mutex_unlock(vc->queue_mutex); |
313 | const struct RTPHeader *const header = &p->header; | ||
307 | 314 | ||
308 | uint32_t full_data_len; | 315 | uint32_t full_data_len; |
309 | 316 | ||
310 | if (rb_read((RingBuffer *)vc->vbuf_raw, (void **)&p)) { | 317 | if (header->flags & RTP_LARGE_FRAME) { |
311 | pthread_mutex_unlock(vc->queue_mutex); | 318 | full_data_len = header->data_length_full; |
312 | const struct RTPHeader *const header = &p->header; | 319 | LOGGER_DEBUG(vc->log, "vc_iterate:001:full_data_len=%d", (int)full_data_len); |
320 | } else { | ||
321 | full_data_len = p->len; | ||
322 | LOGGER_DEBUG(vc->log, "vc_iterate:002"); | ||
323 | } | ||
313 | 324 | ||
314 | if (header->flags & RTP_LARGE_FRAME) { | 325 | LOGGER_DEBUG(vc->log, "vc_iterate: rb_read p->len=%d p->header.xe=%d", (int)full_data_len, p->header.xe); |
315 | full_data_len = header->data_length_full; | 326 | LOGGER_DEBUG(vc->log, "vc_iterate: rb_read rb size=%d", (int)rb_size((RingBuffer *)vc->vbuf_raw)); |
316 | LOGGER_DEBUG(vc->log, "vc_iterate:001:full_data_len=%d", (int)full_data_len); | 327 | const vpx_codec_err_t rc = vpx_codec_decode(vc->decoder, p->data, full_data_len, nullptr, MAX_DECODE_TIME_US); |
317 | } else { | 328 | free(p); |
318 | full_data_len = p->len; | ||
319 | LOGGER_DEBUG(vc->log, "vc_iterate:002"); | ||
320 | } | ||
321 | 329 | ||
322 | LOGGER_DEBUG(vc->log, "vc_iterate: rb_read p->len=%d p->header.xe=%d", (int)full_data_len, p->header.xe); | 330 | if (rc != VPX_CODEC_OK) { |
323 | LOGGER_DEBUG(vc->log, "vc_iterate: rb_read rb size=%d", (int)rb_size((RingBuffer *)vc->vbuf_raw)); | 331 | LOGGER_ERROR(vc->log, "Error decoding video: %d %s", (int)rc, vpx_codec_err_to_string(rc)); |
324 | rc = vpx_codec_decode(vc->decoder, p->data, full_data_len, nullptr, MAX_DECODE_TIME_US); | 332 | return; |
325 | free(p); | 333 | } |
326 | 334 | ||
327 | if (rc != VPX_CODEC_OK) { | 335 | /* Play decoded images */ |
328 | LOGGER_ERROR(vc->log, "Error decoding video: %d %s", (int)rc, vpx_codec_err_to_string(rc)); | 336 | vpx_codec_iter_t iter = nullptr; |
329 | } else { | 337 | vpx_image_t *dest = nullptr; |
330 | /* Play decoded images */ | 338 | |
331 | vpx_codec_iter_t iter = nullptr; | 339 | while ((dest = vpx_codec_get_frame(vc->decoder, &iter)) != nullptr) { |
332 | vpx_image_t *dest = nullptr; | 340 | if (vc->vcb.first) { |
333 | 341 | vc->vcb.first(vc->av, vc->friend_number, dest->d_w, dest->d_h, | |
334 | while ((dest = vpx_codec_get_frame(vc->decoder, &iter)) != nullptr) { | 342 | (const uint8_t *)dest->planes[0], (const uint8_t *)dest->planes[1], (const uint8_t *)dest->planes[2], |
335 | if (vc->vcb.first) { | 343 | dest->stride[0], dest->stride[1], dest->stride[2], vc->vcb.second); |
336 | vc->vcb.first(vc->av, vc->friend_number, dest->d_w, dest->d_h, | ||
337 | (const uint8_t *)dest->planes[0], (const uint8_t *)dest->planes[1], (const uint8_t *)dest->planes[2], | ||
338 | dest->stride[0], dest->stride[1], dest->stride[2], vc->vcb.second); | ||
339 | } | ||
340 | |||
341 | vpx_img_free(dest); // is this needed? none of the VPx examples show that | ||
342 | } | ||
343 | } | 344 | } |
344 | 345 | ||
345 | return; | 346 | vpx_img_free(dest); // is this needed? none of the VPx examples show that |
346 | } else { | ||
347 | LOGGER_TRACE(vc->log, "no Video frame data available"); | ||
348 | } | 347 | } |
349 | |||
350 | pthread_mutex_unlock(vc->queue_mutex); | ||
351 | } | 348 | } |
352 | 349 | ||
353 | int vc_queue_message(void *vcp, struct RTPMessage *msg) | 350 | int vc_queue_message(void *vcp, struct RTPMessage *msg) |
diff --git a/toxcore/group.c b/toxcore/group.c index 95de1afb..826ea239 100644 --- a/toxcore/group.c +++ b/toxcore/group.c | |||
@@ -2270,12 +2270,9 @@ static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16 | |||
2270 | g->group[peer_index].top_lossy_number = message_number; | 2270 | g->group[peer_index].top_lossy_number = message_number; |
2271 | g->group[peer_index].bottom_lossy_number = (message_number - MAX_LOSSY_COUNT) + 1; | 2271 | g->group[peer_index].bottom_lossy_number = (message_number - MAX_LOSSY_COUNT) + 1; |
2272 | g->group[peer_index].recv_lossy[message_number % MAX_LOSSY_COUNT] = 1; | 2272 | g->group[peer_index].recv_lossy[message_number % MAX_LOSSY_COUNT] = 1; |
2273 | |||
2274 | return 0; | ||
2275 | } else { // top_distance < MAX_LOSSY_COUNT | 2273 | } else { // top_distance < MAX_LOSSY_COUNT |
2276 | unsigned int i; | 2274 | for (unsigned int i = g->group[peer_index].bottom_lossy_number; |
2277 | 2275 | i != g->group[peer_index].bottom_lossy_number + top_distance; | |
2278 | for (i = g->group[peer_index].bottom_lossy_number; i != (g->group[peer_index].bottom_lossy_number + top_distance); | ||
2279 | ++i) { | 2276 | ++i) { |
2280 | g->group[peer_index].recv_lossy[i % MAX_LOSSY_COUNT] = 0; | 2277 | g->group[peer_index].recv_lossy[i % MAX_LOSSY_COUNT] = 0; |
2281 | } | 2278 | } |
@@ -2283,9 +2280,10 @@ static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16 | |||
2283 | g->group[peer_index].top_lossy_number = message_number; | 2280 | g->group[peer_index].top_lossy_number = message_number; |
2284 | g->group[peer_index].bottom_lossy_number = (message_number - MAX_LOSSY_COUNT) + 1; | 2281 | g->group[peer_index].bottom_lossy_number = (message_number - MAX_LOSSY_COUNT) + 1; |
2285 | g->group[peer_index].recv_lossy[message_number % MAX_LOSSY_COUNT] = 1; | 2282 | g->group[peer_index].recv_lossy[message_number % MAX_LOSSY_COUNT] = 1; |
2286 | |||
2287 | return 0; | ||
2288 | } | 2283 | } |
2284 | |||
2285 | return 0; | ||
2286 | |||
2289 | } | 2287 | } |
2290 | 2288 | ||
2291 | static int handle_lossy(void *object, int friendcon_id, const uint8_t *data, uint16_t length, void *userdata) | 2289 | static int handle_lossy(void *object, int friendcon_id, const uint8_t *data, uint16_t length, void *userdata) |