- return send_command_packet(mms);
-}
-
-static int read_data(MMSContext *mms, uint8_t *buf, const int buf_size)
-{
- int read_size;
- read_size = FFMIN(buf_size, mms->remaining_in_len);
- memcpy(buf, mms->read_in_ptr, read_size);
- mms->remaining_in_len -= read_size;
- mms->read_in_ptr += read_size;
- return read_size;
-}
-
-/** Read at most one media packet (or a whole header). */
-static int read_mms_packet(MMSContext *mms, uint8_t *buf, int buf_size)
-{
- int result = 0, read_header_size = 0;
- int size_to_copy;
-
- do {
- if(read_header_size < mms->asf_header_size && !mms->is_playing) {
- /* Read from ASF header buffer */
- size_to_copy= FFMIN(buf_size,
- mms->asf_header_size - read_header_size);
- memcpy(buf, mms->asf_header + read_header_size, size_to_copy);
- read_header_size += size_to_copy;
- result += size_to_copy;
- dprintf(NULL, "Copied %d bytes from stored header. left: %d\n",
- size_to_copy, mms->asf_header_size - read_header_size);
- if (mms->asf_header_size == read_header_size) {
- av_freep(&mms->asf_header);
- mms->is_playing = 1;
- }
- } else if(mms->remaining_in_len) {
- /* Read remaining packet data to buffer.
- * the result can not be zero because remaining_in_len is positive.*/
- result = read_data(mms, buf, buf_size);
- } else {
- /* Read from network */
- int err = mms_safe_send_recv(mms, NULL, SC_PKT_ASF_MEDIA);
- if (err == 0) {
- if(mms->remaining_in_len>mms->asf_packet_len) {
- dprintf(NULL, "Incoming packet"
- "larger than the asf packet size stated (%d>%d)\n",
- mms->remaining_in_len, mms->asf_packet_len);
- result= AVERROR_IO;
- } else {
- // copy the data to the packet buffer.
- result = read_data(mms, buf, buf_size);
- if (result == 0) {
- dprintf(NULL, "read asf media paket size is zero!\n");
- break;
- }
- }
- } else {
- dprintf(NULL, "read packet error!\n");
- break;
- }
- }
- } while(!result); // only return one packet.
- return result;