Commit 1032db93b15f0a5fd38d6cfe0aacf021102c0ee0
1 parent
67c30b3a
Per @jklontz's suggestion, replace the look-ahead scheme with a sentinel
Instead of maintaining a lookahead buffer so that the last frame number can be known before processing it, just push an empty FrameData through the stream when the DataSource breaks.
Showing
1 changed file
with
5 additions
and
36 deletions
openbr/plugins/stream.cpp
| ... | ... | @@ -647,28 +647,6 @@ public: |
| 647 | 647 | return false; |
| 648 | 648 | } |
| 649 | 649 | |
| 650 | - // Try to get a frame from the global pool | |
| 651 | - FrameData * firstFrame = allFrames.tryGetItem(); | |
| 652 | - | |
| 653 | - // If this fails, things have gone pretty badly. | |
| 654 | - if (firstFrame == NULL) { | |
| 655 | - is_broken = true; | |
| 656 | - return false; | |
| 657 | - } | |
| 658 | - | |
| 659 | - // Read a frame from the video source | |
| 660 | - bool res = getNextFrame(*firstFrame); | |
| 661 | - | |
| 662 | - // the data source broke already, we couldn't even get one frame | |
| 663 | - // from it even though it claimed to have opened successfully. | |
| 664 | - if (!res) { | |
| 665 | - is_broken = true; | |
| 666 | - return false; | |
| 667 | - } | |
| 668 | - | |
| 669 | - // We read one frame ahead of the last one returned, this allows | |
| 670 | - // us to know which frame is the final frame when we return it. | |
| 671 | - lookAhead.append(firstFrame); | |
| 672 | 650 | return true; |
| 673 | 651 | } |
| 674 | 652 | |
| ... | ... | @@ -698,26 +676,17 @@ public: |
| 698 | 676 | if (!res) |
| 699 | 677 | { |
| 700 | 678 | QMutexLocker lock(&last_frame_update); |
| 701 | - final_frame = lookAhead.back()->sequenceNumber; | |
| 702 | - allFrames.addItem(aFrame); | |
| 679 | + final_frame = aFrame->sequenceNumber; | |
| 680 | + aFrame->data().clear(); | |
| 703 | 681 | } |
| 704 | - else { | |
| 705 | - lookAhead.push_back(aFrame); | |
| 706 | - } | |
| 707 | - | |
| 708 | - // we will return the first frame on the lookAhead buffer | |
| 709 | - FrameData * rVal = lookAhead.first(); | |
| 710 | - lookAhead.pop_front(); | |
| 711 | - if (rVal->data.empty()) | |
| 712 | - qDebug("returning empty frame from look ahead!"); | |
| 713 | 682 | |
| 714 | 683 | // If this is the last frame, say so |
| 715 | - if (rVal->sequenceNumber == final_frame) { | |
| 684 | + if (aFrame->sequenceNumber == final_frame) { | |
| 716 | 685 | last_frame = true; |
| 717 | 686 | is_broken = true; |
| 718 | 687 | } |
| 719 | 688 | |
| 720 | - return rVal; | |
| 689 | + return aFrame; | |
| 721 | 690 | } |
| 722 | 691 | |
| 723 | 692 | // Return a frame to the pool, returns true if the frame returned was the last |
| ... | ... | @@ -845,6 +814,7 @@ protected: |
| 845 | 814 | // couldn't get the next template? nothing to do, otherwise we try to read |
| 846 | 815 | // a frame at the top of this loop. |
| 847 | 816 | if (!open_res) { |
| 817 | + output.sequenceNumber = next_sequence_number; | |
| 848 | 818 | return false; |
| 849 | 819 | } |
| 850 | 820 | } |
| ... | ... | @@ -870,7 +840,6 @@ protected: |
| 870 | 840 | bool allReturned; |
| 871 | 841 | |
| 872 | 842 | DoubleBuffer allFrames; |
| 873 | - QList<FrameData *> lookAhead; | |
| 874 | 843 | |
| 875 | 844 | QWaitCondition lastReturned; |
| 876 | 845 | QMutex last_frame_update; | ... | ... |