| 163 | } |
| 164 | |
| 165 | int main(int ac, char **av) |
| 166 | { |
| 167 | int i, ret = 0; |
| 168 | int max_queue_size; |
| 169 | int nb_senders, sender_min_load, sender_max_load; |
| 170 | int nb_receivers, receiver_min_load, receiver_max_load; |
| 171 | struct sender_data *senders; |
| 172 | struct receiver_data *receivers; |
| 173 | AVThreadMessageQueue *queue = NULL; |
| 174 | |
| 175 | if (ac != 8) { |
| 176 | av_log(NULL, AV_LOG_ERROR, "%s <max_queue_size> " |
| 177 | "<nb_senders> <sender_min_send> <sender_max_send> " |
| 178 | "<nb_receivers> <receiver_min_recv> <receiver_max_recv>\n", av[0]); |
| 179 | return 1; |
| 180 | } |
| 181 | |
| 182 | max_queue_size = atoi(av[1]); |
| 183 | nb_senders = atoi(av[2]); |
| 184 | sender_min_load = atoi(av[3]); |
| 185 | sender_max_load = atoi(av[4]); |
| 186 | nb_receivers = atoi(av[5]); |
| 187 | receiver_min_load = atoi(av[6]); |
| 188 | receiver_max_load = atoi(av[7]); |
| 189 | |
| 190 | if (max_queue_size <= 0 || |
| 191 | nb_senders <= 0 || sender_min_load <= 0 || sender_max_load <= 0 || |
| 192 | nb_receivers <= 0 || receiver_min_load <= 0 || receiver_max_load <= 0) { |
| 193 | av_log(NULL, AV_LOG_ERROR, "negative values not allowed\n"); |
| 194 | return 1; |
| 195 | } |
| 196 | |
| 197 | av_log(NULL, AV_LOG_INFO, "qsize:%d / %d senders sending [%d-%d] / " |
| 198 | "%d receivers receiving [%d-%d]\n", max_queue_size, |
| 199 | nb_senders, sender_min_load, sender_max_load, |
| 200 | nb_receivers, receiver_min_load, receiver_max_load); |
| 201 | |
| 202 | senders = av_calloc(nb_senders, sizeof(*senders)); |
| 203 | receivers = av_calloc(nb_receivers, sizeof(*receivers)); |
| 204 | if (!senders || !receivers) { |
| 205 | ret = AVERROR(ENOMEM); |
| 206 | goto end; |
| 207 | } |
| 208 | |
| 209 | ret = av_thread_message_queue_alloc(&queue, max_queue_size, sizeof(struct message)); |
| 210 | if (ret < 0) |
| 211 | goto end; |
| 212 | |
| 213 | av_thread_message_queue_set_free_func(queue, free_frame); |
| 214 | |
| 215 | #define SPAWN_THREADS(type) do { \ |
| 216 | for (i = 0; i < nb_##type##s; i++) { \ |
| 217 | struct type##_data *td = &type##s[i]; \ |
| 218 | \ |
| 219 | td->id = i; \ |
| 220 | td->queue = queue; \ |
| 221 | td->workload = get_workload(type##_min_load, type##_max_load); \ |
| 222 | \ |
nothing calls this directly
no test coverage detected