00001 00032 #ifndef __VETLIB_VETBUFFERLINK_H__ 00033 #define __VETLIB_VETBUFFERLINK_H__ 00034 00035 #include "../vetBuffer.h" 00036 00037 00038 #define VETDEF_FPS_MAX 1000 /* maximum number of frames per second */ 00039 00040 #define VETRET_FRAME_NOT_FOUND 8254 00041 00042 00043 template<class T> 00044 class vetBufferLink : public vetBuffer<T> 00045 { 00046 protected: 00047 00048 00049 struct frameNode { 00050 T* data; 00051 struct frameNode * prev; 00052 struct frameNode * next; 00053 }; 00054 00055 frameNode* v_first; 00056 frameNode* v_current; 00057 frameNode* v_last; 00058 00059 00060 00061 public: 00062 00063 00067 vetBufferLink() : vetBuffer<T>() 00068 { 00069 INFO("vetBufferLink::vetBufferLink() : vetBuffer() [CONTRUCTOR]") 00070 00071 v_first = NULL; 00072 v_current = NULL; 00073 v_last = NULL; 00074 00075 reset(); 00076 } 00077 00081 ~vetBufferLink() 00082 { 00083 INFO("vetBufferLink::~vetBufferLink() [DESTRUCTOR]") 00084 00085 if ( v_first == NULL) 00086 return; 00087 00088 v_current = v_first->next; 00089 00090 } 00091 00097 VETRESULT reset() 00098 { 00099 INFO("int vetBufferLink::reset() [SET DEFAULT PARAMETERS]") 00100 00101 v_first = NULL; 00102 v_current = NULL; 00103 v_last = NULL; 00104 v_fcount = 0; 00105 00106 return VETRET_OK; 00107 } 00108 00114 VETRESULT deleteFrames() 00115 { 00116 if ( v_first != NULL) 00117 { 00118 v_current = v_first->next; 00119 00120 while ( v_current != NULL ) { 00121 //BUGBUGBUG 00122 delete v_current->prev; 00123 delete v_current->data; 00124 v_current = v_current->next; 00125 } 00126 00127 delete v_last->data; 00128 delete v_last; 00129 } 00130 else 00131 return VETRET_ILLEGAL_USE; 00132 00133 return reset(); 00134 } 00135 00136 00137 00138 00139 00149 VETRESULT addFrame(T* newFrame) 00150 { 00151 if ( &newFrame == NULL) 00152 return VETRET_PARAM_ERR; 00153 00154 if ( v_fcount == 0) { 00155 v_first = new frameNode; 00156 v_first->next = NULL; 00157 v_first->prev = NULL; 00158 00159 if ( copyData ) 00160 v_first->data = new T(*newFrame); 00161 else 00162 v_first->data = newFrame; 00163 00164 v_current = v_first; 00165 v_last = v_first; 00166 ++v_fcount; 00167 return VETRET_OK; 00168 } 00169 00170 frameNode* v_newlast = new frameNode; 00171 00172 if ( copyData ) 00173 v_newlast->data = new T(*newFrame); 00174 else 00175 v_newlast->data = newFrame; 00176 00177 v_newlast->prev = v_last; 00178 v_newlast->next = NULL; 00179 v_last->next = v_newlast; 00180 v_last = v_newlast; 00181 ++v_fcount; 00182 00183 return VETRET_OK; 00184 } 00185 00196 VETRESULT insertFrame(long index, T* newFrame) 00197 { 00198 if ( v_fcount == 0 && index != 0) 00199 return VETRET_ILLEGAL_USE; 00200 00201 if ( &newFrame == NULL) 00202 return VETRET_PARAM_ERR; 00203 00204 if ( v_fcount == 0 ) 00205 return addFrame(newFrame); 00206 00207 if ( index == v_fcount-1 ) 00208 return addFrame(newFrame); 00209 00210 if ( index == 0 ) 00211 { 00212 frameNode* v_newNode = new frameNode; 00213 00214 if ( copyData ) 00215 v_newNode->data = new T(*newFrame); 00216 else 00217 v_newNode->data = newFrame; 00218 00219 v_newNode->prev = NULL; 00220 v_newNode->next = v_first; 00221 v_first->prev = v_newNode; 00222 v_first = v_newNode; 00223 ++v_fcount; 00224 return VETRET_OK; 00225 } 00226 00227 frameNode* iterFrame; 00228 iterFrame = v_first; 00229 long i = 0; 00230 while ( iterFrame ) 00231 { 00232 if ( i == index ) 00233 { 00234 frameNode* v_newNode = new frameNode; 00235 00236 if ( copyData ) 00237 v_newNode->data = new T(*newFrame); 00238 else 00239 v_newNode->data = newFrame; 00240 00241 v_newNode->prev = iterFrame->prev; 00242 v_newNode->next = iterFrame; 00243 iterFrame->prev->next = v_newNode; 00244 iterFrame->prev = v_newNode; 00245 ++v_fcount; 00246 return VETRET_OK; 00247 } 00248 iterFrame = iterFrame->next; 00249 i++; 00250 } 00251 00252 return VETRET_INTERNAL_ERR; 00253 } 00254 00265 VETRESULT updateFrame(T* oldFrame, T* newFrame, bool removeold) 00266 { 00267 if ( v_fcount == 0) 00268 return VETRET_ILLEGAL_USE; 00269 00270 if ( &oldFrame == NULL || newFrame == NULL ) 00271 return VETRET_PARAM_ERR; 00272 00273 frameNode* iterFrame; 00274 iterFrame = v_first; 00275 00276 while ( iterFrame ) 00277 { 00278 if ( iterFrame->data == oldFrame ) 00279 { 00280 if (removeold) 00281 delete oldFrame; 00282 00283 if ( copyData ) 00284 iterFrame->data = new T(*newFrame); 00285 else 00286 iterFrame->data = newFrame; 00287 00288 return VETRET_OK; 00289 } 00290 iterFrame = iterFrame->next; 00291 } 00292 00293 return VETRET_FRAME_NOT_FOUND; 00294 } 00295 00306 VETRESULT updateFrame(long index, T* newFrame, bool removeold) 00307 { 00308 if ( v_fcount == 0) 00309 return VETRET_ILLEGAL_USE; 00310 00311 if ( &newFrame == NULL) 00312 return VETRET_PARAM_ERR; 00313 00314 if ( index > v_fcount-1 ) 00315 return VETRET_PARAM_ERR; 00316 00317 long distEnd = v_fcount - index; 00318 frameNode* iterFrame; 00319 00320 if ( index < distEnd ) 00321 { 00322 iterFrame = v_first; 00323 long i = 0; 00324 while ( iterFrame ) 00325 { 00326 if ( i == index ) 00327 { 00328 if ( removeold ) 00329 delete iterFrame->data; 00330 00331 if ( copyData ) 00332 iterFrame->data = new T(*newFrame); 00333 else 00334 iterFrame->data = newFrame; 00335 00336 return VETRET_OK; 00337 } 00338 iterFrame = iterFrame->next; 00339 i++; 00340 } 00341 } 00342 else 00343 { 00344 iterFrame = v_last; 00345 long i = v_fcount-1; 00346 while ( iterFrame ) 00347 { 00348 if ( i == index ) 00349 { 00350 delete iterFrame->data; 00351 iterFrame->data = newFrame; 00352 return VETRET_OK; 00353 } 00354 iterFrame = iterFrame->prev; 00355 i--; 00356 } 00357 } 00358 00359 return VETRET_FRAME_NOT_FOUND; 00360 } 00361 00370 VETRESULT removeFrame(T* frameToDelete, bool freeData = false) 00371 { 00372 if ( v_fcount == 0) 00373 return VETRET_ILLEGAL_USE; 00374 00375 if ( frameToDelete == NULL) 00376 return VETRET_PARAM_ERR; 00377 00378 if ( v_fcount == 1) 00379 { 00380 delete v_first; 00381 v_first = NULL; 00382 v_current = NULL; 00383 v_last = NULL; 00384 v_fcount = 0; 00385 } 00386 00387 if ( v_first->data == frameToDelete ) 00388 { 00389 v_first = v_first->next; 00390 delete v_first->prev; 00391 v_first->prev = NULL; 00392 --v_fcount; 00393 return VETRET_OK; 00394 } 00395 else if ( v_last->data == frameToDelete) 00396 { 00397 v_last = v_last->prev; 00398 delete v_last->next; 00399 v_last->next = NULL; 00400 --v_fcount; 00401 return VETRET_OK; 00402 } 00403 00404 frameNode* iterFrame; 00405 iterFrame = v_first->next; 00406 while ( iterFrame ) 00407 { 00408 if ( iterFrame->data == frameToDelete ) 00409 { 00410 if ( freeData ) 00411 delete frameToDelete; 00412 00413 iterFrame->data = NULL; 00414 iterFrame->prev->next = iterFrame->next; 00415 iterFrame->next->prev = iterFrame->prev; 00416 00417 delete iterFrame; 00418 --v_fcount; 00419 00420 return VETRET_OK; 00421 } 00422 iterFrame = iterFrame->next; 00423 } 00424 00425 return VETRET_FRAME_NOT_FOUND; 00426 00427 } 00428 00437 VETRESULT removeFrame(long index, bool freeData = false) 00438 { 00439 if ( v_fcount == 0) 00440 return VETRET_ILLEGAL_USE; 00441 00442 if ( index >= v_fcount) 00443 return VETRET_PARAM_ERR; 00444 00445 if ( index == 0) 00446 { 00447 v_first->next = v_first; 00448 delete v_first->prev; 00449 v_first->prev = NULL; 00450 return VETRET_OK; 00451 } 00452 else if ( index == v_fcount-1) 00453 { 00454 v_last->prev = v_last; 00455 delete v_last->next; 00456 v_last->next = NULL; 00457 return VETRET_OK; 00458 } 00459 00460 00461 frameNode* iterFrame; 00462 iterFrame = v_first->next; 00463 long i = 0; 00464 while ( iterFrame ) 00465 { 00466 if ( i == index ) 00467 { 00468 if ( freeData ) 00469 delete iterFrame->data; 00470 00471 iterFrame->data = NULL; 00472 iterFrame->prev->next = iterFrame->next; 00473 iterFrame->next->prev = iterFrame->prev; 00474 00475 delete iterFrame; 00476 --v_fcount; 00477 00478 return VETRET_OK; 00479 } 00480 iterFrame = iterFrame->next; 00481 i++; 00482 } 00483 00484 return VETRET_FRAME_NOT_FOUND; 00485 } 00486 00492 T* getCurrentFrame() 00493 { 00494 if ( v_fcount == 0) 00495 throw "Video is Empty."; 00496 00497 return v_current->data; 00498 } 00499 00505 T* getPreviousFrame() 00506 { 00507 if ( v_fcount == 0) 00508 throw "Video is Empty."; 00509 00510 if ( v_current->prev == NULL ) 00511 throw "Out of range."; 00512 00513 return v_current->prev->data; 00514 00515 } 00516 00522 T* getNextFrame() 00523 { 00524 if ( v_fcount == 0) 00525 throw "Video is Empty."; 00526 00527 if ( v_current->next == NULL ) 00528 throw "Out of range."; 00529 00530 return v_current->next->data; 00531 00532 } 00533 00539 T* getFirstFrame() 00540 { 00541 if ( v_fcount == 0) 00542 throw "Video is Empty."; 00543 00544 return v_first->data; 00545 } 00546 00547 00553 T* getLastFrame() 00554 { 00555 if ( v_fcount == 0) 00556 throw "Video is Empty."; 00557 00558 return v_last->data; 00559 } 00560 00566 long getCurrentFrameIndex() const 00567 { 00568 frameNode* iterFrame; 00569 iterFrame = v_first; 00570 long i = 0; 00571 while ( iterFrame ) 00572 { 00573 if ( iterFrame->data == v_current->data ) 00574 return i; 00575 00576 iterFrame = iterFrame->next; 00577 i++; 00578 } 00579 00580 return -1; 00581 } 00582 00583 00591 T* getFrame(long index) 00592 { 00593 if ( v_fcount == 0) 00594 throw "Video is Empty."; 00595 00596 if ( index < 0 || index >= v_fcount ) 00597 throw "Out of range"; 00598 00599 long distEnd = v_fcount - index; 00600 00601 if ( index < distEnd ) 00602 { 00603 00604 frameNode* iterFrame; 00605 iterFrame = v_first; 00606 long i = 0; 00607 while ( iterFrame ) 00608 { 00609 if ( i == index ) 00610 return iterFrame->data; 00611 00612 iterFrame = iterFrame->next; 00613 i++; 00614 } 00615 00616 } 00617 else 00618 { 00619 frameNode* iterFrame; 00620 iterFrame = v_last; 00621 long i = v_fcount-1; 00622 while ( iterFrame ) 00623 { 00624 if ( i == index ) 00625 return iterFrame->data; 00626 iterFrame = iterFrame->prev; 00627 i--; 00628 } 00629 00630 } 00631 00632 throw "Index not found, internal error."; 00633 } 00634 00641 VETRESULT goToNextFrame() 00642 { 00643 if ( v_fcount == 0) 00644 return VETRET_ILLEGAL_USE; 00645 00646 if ( v_current->next == NULL ) 00647 return VETRET_ILLEGAL_USE; 00648 00649 v_current = v_current->next; 00650 00651 return VETRET_OK; 00652 } 00653 00660 VETRESULT goToPreviousFrame() 00661 { 00662 if ( v_fcount == 0) 00663 return VETRET_ILLEGAL_USE; 00664 00665 if ( v_current->prev == NULL ) 00666 return VETRET_ILLEGAL_USE; 00667 00668 v_current = v_current->prev; 00669 00670 return VETRET_OK; 00671 } 00672 00678 VETRESULT goToFirstFrame() 00679 { 00680 if ( v_fcount == 0) 00681 return VETRET_ILLEGAL_USE; 00682 00683 v_current = v_first; 00684 00685 return VETRET_OK; 00686 } 00687 00693 VETRESULT goToLastFrame() 00694 { 00695 if ( v_fcount == 0) 00696 return VETRET_ILLEGAL_USE; 00697 00698 v_current = v_last; 00699 00700 return VETRET_OK; 00701 } 00702 00711 VETRESULT goToFrame(long index) 00712 { 00713 if ( v_fcount == 0) 00714 return VETRET_ILLEGAL_USE; 00715 00716 if ( index < 0 || index >= v_fcount ) 00717 return VETRET_PARAM_ERR; 00718 00719 long distEnd = v_fcount - index; 00720 00721 if ( index < distEnd ) 00722 { 00723 frameNode* iterFrame; 00724 iterFrame = v_first; 00725 long i = 0; 00726 while ( iterFrame ) 00727 { 00728 if ( i == index ) 00729 { 00730 v_current = iterFrame; 00731 return VETRET_OK; 00732 } 00733 iterFrame = iterFrame->next; 00734 i++; 00735 } 00736 00737 } 00738 else 00739 { 00740 frameNode* iterFrame; 00741 iterFrame = v_last; 00742 long i = v_fcount-1; 00743 while ( iterFrame ) 00744 { 00745 if ( i == index ) 00746 { 00747 v_current = iterFrame; 00748 return VETRET_OK; 00749 } 00750 iterFrame = iterFrame->prev; 00751 i--; 00752 } 00753 00754 } 00755 00756 return VETRET_INTERNAL_ERR; 00757 } 00758 00767 VETRESULT goToStepFrame(long offset) 00768 { 00769 if ( v_fcount == 0 || offset == 0 ) 00770 return VETRET_ILLEGAL_USE; 00771 00772 if ( offset >= v_fcount || offset <= -v_fcount ) 00773 return VETRET_PARAM_ERR; 00774 00775 frameNode* iterFrame; 00776 iterFrame = v_current; 00777 00778 if ( offset > 0 ) 00779 { 00780 long i = 0; 00781 while ( iterFrame ) 00782 { 00783 if ( i == offset ) 00784 { 00785 v_current = iterFrame; 00786 return VETRET_OK; 00787 } 00788 iterFrame = iterFrame->next; 00789 i++; 00790 } 00791 00792 } 00793 else 00794 { 00795 long i = v_fcount-1; 00796 while ( iterFrame ) 00797 { 00798 if ( i == offset ) 00799 { 00800 v_current = iterFrame; 00801 return VETRET_OK; 00802 } 00803 iterFrame = iterFrame->prev; 00804 i--; 00805 } 00806 00807 } 00808 00809 return VETRET_INTERNAL_ERR; 00810 } 00811 00812 00813 00814 00815 00816 }; 00817 00818 00819 #endif /* __VETLIB_VETBUFFERLINK_H__ */ 00820
1.4.4