////--- Write to buffer int RingBuffer_write (RingBuffer* buffer, float* data, int length){ //buffer --> The buffer where to right //data --> A pointer to the memory containing the data to be written //length --> This is the total number of BYTES to be copied.(Used in memcpy) // Length is defined by: [the number of elements in data]x[size of each element] // First check if there is available data , if not, reset the indexes to 0 if(RingBuffer_available_data(buffer) == 0) { buffer->start = buffer->end = 0; //printf("start=end=0 from write\n"); } //check if the number of input elements is greater thant the space left in buffer if(length > RingBuffer_available_space(buffer)){ printf("Not enough space, ocuppied: %d of:%d, inputOf: %d", RingBuffer_available_data(buffer), buffer->length,length); return -1; } //if it is save to write you can proceed void *result = memcpy(RingBuffer_ends_at(buffer), data, length*sizeof(float)); if (result==NULL) { printf("Failed to write data into buffer."); } //Commit the write operation RingBuffer_commit_write(buffer, length); //return the number of elements written return length; }
int RingBuffer_write(RingBuffer *buffer, uint8_t *data, int length) { void *result; int margin = (buffer->length) - (buffer->end); if (RingBuffer_available_space(buffer) < length) { //printf("\n\rNo sufficient available space\n"); return 1; } if (length < margin) { result = memcpy(RingBuffer_ends_at(buffer), data, length); if (result == NULL){ printf("\n\rFailed to write data into buffer\n"); return 3; } buffer->end += length; } else { result = memcpy(RingBuffer_ends_at(buffer), data, margin); if (result == NULL){ printf("\n\rFailed to write data into buffer\n"); return 3; } buffer->end = 0; if (length > margin) { result = memcpy(RingBuffer_ends_at(buffer), (data+margin), length - margin); if (result == NULL){ printf("\n\rFailed to write data into buffer"); return 3; } buffer->end += length - margin; } } buffer->ndata += length; return 0; }
int RingBuffer_write(RingBuffer *buffer, char *data, int length) { if (RingBuffer_available(buffer) == 0) { buffer->start = buffer->end = 0; } check(length <= RingBuffer_available_space(buffer), "not enough space: %d request, %d available", RingBuffer_available_data(buffer), length); void *result = memcpy(RingBuffer_ends_at(buffer), data, length); check(result != NULL, "failed to write into buffer"); RingBuffer_commit_write(buffer, length); return length; error: return -1; }
void do_read(evutil_socket_t fd, short events, void *arg) { (void) events; struct fd_state *state = arg; ssize_t result; while (1) { assert(state->write_event); result = recv(fd, RingBuffer_ends_at(state->buffer), RingBuffer_available_space(state->buffer), 0); if (result <= 0) break; state->rtmp->total_read += result; RingBuffer_commit_write(state->buffer, result); while (RingBuffer_available_data(state->buffer) > 0) { RtmpOutputMessage *this_output = rtmp_create_output_message(); int result_multiplex = rtmp_multiplex(state->rtmp, state->buffer, this_output); check(result_multiplex >= 0, "rtmp_multiplex error %d", result_multiplex); if (state->rtmp->end == 1) { event_del(state->write_event); rtmp_destroy_output_message(this_output); free_fd_state(state); return; } if (this_output->length > 0) { printf("Add block with length=%u\n", this_output->length); List_push(state->outputs, this_output); assert(state->write_event); event_add(state->write_event, NULL); } else { rtmp_destroy_output_message(this_output); } if (result_multiplex == 0) break; } printf("total_read=%u, last_total_read=%u\n", state->rtmp->total_read, state->rtmp->last_total_read); if (rtmp_should_acknowledge(state->rtmp) == 1) { RtmpOutputMessage *ack = rtmp_create_output_message(); rtmp_allocate_output_message_content(ack, 16); int i = 0; unsigned char *msg = ack->message; msg[i++] = 0x02; msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x00; int_to_byte_array(4, msg, i, 3);i += 3; msg[i++] = 0x03; msg[i++] = 0x00; msg[i++] = 0x00; msg[i++] = 0x00; msg[i++] = 0x00; // msg[i++] = 0x03; // msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x04; // msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x00; // msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x00; int_to_byte_array(state->rtmp->total_read, msg, i, 4);i += 4; List_push(state->outputs, ack); assert(state->write_event); event_add(state->write_event, NULL); state->rtmp->last_total_read = state->rtmp->total_read; } } if (result == 0) { free_fd_state(state); } else if (result < 0) { if (errno == EAGAIN) // XXXX use evutil macro return; perror("recv"); free_fd_state(state); } error: free_fd_state(state); return; }