--- /dev/null
+#include "libzmpeg3.h"
+
+zstrack_t::
+strack_t(int zid, video_t *vid)
+{
+ id = zid;
+ video = vid;
+}
+
+zstrack_t::
+~strack_t()
+{
+ if( offsets ) delete [] offsets;
+}
+
+zstrack_t::
+strack_t(zstrack_t &strack)
+{
+ id = strack.id;
+ video = strack.video;
+ allocated_offsets = strack.allocated_offsets;
+ total_offsets = strack.total_offsets;
+ offsets = new int64_t[allocated_offsets];
+ for( int i=0; i<total_offsets; ++i )
+ offsets[i] = strack.offsets[i];
+}
+
+void zstrack_t::
+extend_offsets()
+{
+ if( allocated_offsets <= total_offsets ) {
+ long new_allocation = ZMAX(2*total_offsets, 16);
+ int64_t *new_offsets = new int64_t[new_allocation];
+ for( int i=0; i<total_offsets; ++i )
+ new_offsets[i] = offsets[i];
+ delete [] offsets;
+ offsets = new_offsets;
+ allocated_offsets = new_allocation;
+ }
+}
+
+void zstrack_t::
+append_subtitle_offset(int64_t program_offset)
+{
+ extend_offsets();
+ offsets[total_offsets++] = program_offset;
+}
+
+int zstrack_t::
+append_subtitle(zsubtitle_t *subtitle, int lock)
+{
+ int ret = 1;
+ rwlock.write_enter(lock);
+ if( total_subtitles < MAX_SUBTITLES ) {
+ subtitles[total_subtitles++] = subtitle;
+ subtitle->done = 1;
+ ret = 0;
+ }
+ rwlock.write_leave(lock);
+ return ret;
+}
+
+void zstrack_t::
+del_subtitle(subtitle_t *subtitle, int lock)
+{
+ rwlock.write_enter(lock);
+ int i = 0;
+ while( i<total_subtitles && subtitles[i]!=subtitle ) ++i;
+ if( i < total_subtitles ) {
+ while( ++i<total_subtitles ) subtitles[i-1] = subtitles[i];
+ --total_subtitles;
+ }
+ subtitle->draw = subtitle->done = -1;
+ rwlock.write_leave(lock);
+}
+
+void zstrack_t::
+del_all_subtitles()
+{
+ rwlock.write_enter();
+ for( int i=0; i<total_subtitles; ++i ) {
+ subtitle_t *sp = subtitles[i];
+ sp->draw = sp->done = -1;
+ if( sp->force < 0 ) delete sp;
+ }
+ total_subtitles = 0;
+ rwlock.write_leave();
+}
+
+void zstrack_t::
+del_subtitle(int idx, int lock)
+{
+ del_subtitle(subtitles[idx], lock);
+}
+