~ubuntu-branches/ubuntu/trusty/gstreamer1.0/trusty-proposed

« back to all changes in this revision

Viewing changes to libs/gst/base/gstbaseparse.c

  • Committer: Package Import Robot
  • Author(s): Sebastian Dröge
  • Date: 2012-11-21 14:45:04 UTC
  • mfrom: (1.1.9)
  • Revision ID: package-import@ubuntu.com-20121121144504-bcq4hcawj7ecgsxy
Tags: 1.0.3-1
New upstream bugfix release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
218
218
 
219
219
#define MIN_FRAMES_TO_POST_BITRATE 10
220
220
#define TARGET_DIFFERENCE          (20 * GST_SECOND)
 
221
#define MAX_INDEX_ENTRIES          4096
221
222
 
222
223
GST_DEBUG_CATEGORY_STATIC (gst_base_parse_debug);
223
224
#define GST_CAT_DEFAULT gst_base_parse_debug
304
305
  gint64 upstream_size;
305
306
  /* minimum distance between two index entries */
306
307
  GstClockTimeDiff idx_interval;
 
308
  guint64 idx_byte_interval;
307
309
  /* ts and offset of last entry added */
308
310
  GstClockTime index_last_ts;
309
311
  gint64 index_last_offset;
743
745
  parse->priv->upstream_size = 0;
744
746
  parse->priv->upstream_has_duration = FALSE;
745
747
  parse->priv->idx_interval = 0;
 
748
  parse->priv->idx_byte_interval = 0;
746
749
  parse->priv->exact_position = TRUE;
747
750
  parse->priv->seen_keyframe = FALSE;
748
751
 
1117
1120
      /* See if any bitrate tags were posted */
1118
1121
      gst_base_parse_handle_tag (parse, event);
1119
1122
      break;
 
1123
 
 
1124
    case GST_EVENT_STREAM_START:
 
1125
      if (parse->priv->pad_mode != GST_PAD_MODE_PULL)
 
1126
        forward_immediate = TRUE;
 
1127
      break;
 
1128
 
1120
1129
    default:
1121
1130
      break;
1122
1131
  }
1565
1574
 
1566
1575
    /* FIXME need better helper data structure that handles these issues
1567
1576
     * related to ongoing collecting of index entries */
1568
 
    if (parse->priv->index_last_offset >= (gint64) offset) {
1569
 
      GST_DEBUG_OBJECT (parse, "already have entries up to offset "
1570
 
          "0x%08" G_GINT64_MODIFIER "x", parse->priv->index_last_offset);
 
1577
    if (parse->priv->index_last_offset + parse->priv->idx_byte_interval >=
 
1578
        (gint64) offset) {
 
1579
      GST_LOG_OBJECT (parse,
 
1580
          "already have entries up to offset 0x%08" G_GINT64_MODIFIER "x",
 
1581
          parse->priv->index_last_offset + parse->priv->idx_byte_interval);
1571
1582
      goto exit;
1572
1583
    }
1573
1584
 
1627
1638
  gboolean seekable = FALSE;
1628
1639
  gint64 start = -1, stop = -1;
1629
1640
  guint idx_interval = 0;
 
1641
  guint64 idx_byte_interval = 0;
1630
1642
 
1631
1643
  query = gst_query_new_seeking (GST_FORMAT_BYTES);
1632
1644
  if (!gst_pad_peer_query (parse->sinkpad, query)) {
1657
1669
      idx_interval = 500;
1658
1670
    else
1659
1671
      idx_interval = 1000;
 
1672
 
 
1673
    /* ensure that even for large files (e.g. very long audio files), the index
 
1674
     * stays reasonably-size, with some arbitrary limit to the total number of
 
1675
     * index entries */
 
1676
    idx_byte_interval = (stop - start) / MAX_INDEX_ENTRIES;
 
1677
    GST_DEBUG_OBJECT (parse,
 
1678
        "Limiting index entries to %d, indexing byte interval %"
 
1679
        G_GUINT64_FORMAT " bytes", MAX_INDEX_ENTRIES, idx_byte_interval);
1660
1680
  }
1661
1681
 
1662
1682
done:
1669
1689
 
1670
1690
  GST_DEBUG_OBJECT (parse, "idx_interval: %ums", idx_interval);
1671
1691
  parse->priv->idx_interval = idx_interval * GST_MSECOND;
 
1692
  parse->priv->idx_byte_interval = idx_byte_interval;
1672
1693
}
1673
1694
 
1674
1695
/* some misc checks on upstream */