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

« back to all changes in this revision

Viewing changes to gst/gstmessage.c

  • Committer: Package Import Robot
  • Author(s): Sebastian Dröge
  • Date: 2012-08-08 18:12:33 UTC
  • mfrom: (1.1.3)
  • Revision ID: package-import@ubuntu.com-20120808181233-riejwxprfsxh1njl
Tags: 0.11.93-1
* New upstream release:
  + debian/libgstreamer.symbols:
    - Update symbols file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
67
67
  GstStructure *structure;
68
68
} GstMessageImpl;
69
69
 
70
 
#define GST_MESSAGE_STRUCTURE(m) (((GstMessageImpl *)(m))->structure)
 
70
#define GST_MESSAGE_STRUCTURE(m)  (((GstMessageImpl *)(m))->structure)
71
71
 
72
72
typedef struct
73
73
{
105
105
  {GST_MESSAGE_QOS, "qos", 0},
106
106
  {GST_MESSAGE_PROGRESS, "progress", 0},
107
107
  {GST_MESSAGE_TOC, "toc", 0},
 
108
  {GST_MESSAGE_STREAM_START, "stream-start", 0},
108
109
  {0, NULL, 0}
109
110
};
110
111
 
198
199
    gst_structure_free (structure);
199
200
  }
200
201
 
201
 
  g_slice_free1 (GST_MINI_OBJECT_SIZE (message), message);
 
202
  g_slice_free1 (sizeof (GstMessageImpl), message);
202
203
}
203
204
 
204
205
static void
205
 
gst_message_init (GstMessageImpl * message, gsize size, GstMessageType type,
 
206
gst_message_init (GstMessageImpl * message, GstMessageType type,
206
207
    GstObject * src);
207
208
 
208
209
static GstMessage *
217
218
 
218
219
  copy = g_slice_new0 (GstMessageImpl);
219
220
 
220
 
  gst_message_init (copy, sizeof (GstMessageImpl), GST_MESSAGE_TYPE (message),
 
221
  gst_message_init (copy, GST_MESSAGE_TYPE (message),
221
222
      GST_MESSAGE_SRC (message));
222
223
 
223
224
  GST_MESSAGE_TIMESTAMP (copy) = GST_MESSAGE_TIMESTAMP (message);
236
237
}
237
238
 
238
239
static void
239
 
gst_message_init (GstMessageImpl * message, gsize size, GstMessageType type,
 
240
gst_message_init (GstMessageImpl * message, GstMessageType type,
240
241
    GstObject * src)
241
242
{
242
 
  gst_mini_object_init (GST_MINI_OBJECT_CAST (message), _gst_message_type,
243
 
      size);
244
 
 
245
 
  message->message.mini_object.copy =
246
 
      (GstMiniObjectCopyFunction) _gst_message_copy;
247
 
  message->message.mini_object.free =
248
 
      (GstMiniObjectFreeFunction) _gst_message_free;
 
243
  gst_mini_object_init (GST_MINI_OBJECT_CAST (message), 0, _gst_message_type,
 
244
      (GstMiniObjectCopyFunction) _gst_message_copy, NULL,
 
245
      (GstMiniObjectFreeFunction) _gst_message_free);
249
246
 
250
247
  GST_MESSAGE_TYPE (message) = type;
251
248
  if (src)
289
286
            &message->message.mini_object.refcount))
290
287
      goto had_parent;
291
288
  }
292
 
  gst_message_init (message, sizeof (GstMessageImpl), type, src);
 
289
  gst_message_init (message, type, src);
293
290
 
294
291
  GST_MESSAGE_STRUCTURE (message) = structure;
295
292
 
298
295
  /* ERRORS */
299
296
had_parent:
300
297
  {
301
 
    g_slice_free1 (GST_MINI_OBJECT_SIZE (message), message);
 
298
    g_slice_free1 (sizeof (GstMessageImpl), message);
302
299
    g_warning ("structure is already owned by another object");
303
300
    return NULL;
304
301
  }
324
321
 * Returns: The message's sequence number.
325
322
 *
326
323
 * MT safe.
327
 
 *
328
 
 * Since: 0.10.22
329
324
 */
330
325
guint32
331
326
gst_message_get_seqnum (GstMessage * message)
347
342
 * for more information.
348
343
 *
349
344
 * MT safe.
350
 
 *
351
 
 * Since: 0.10.22
352
345
 */
353
346
void
354
347
gst_message_set_seqnum (GstMessage * message, guint32 seqnum)
448
441
 * MT safe.
449
442
 *
450
443
 * Returns: (transfer full): the new info message.
451
 
 *
452
 
 * Since: 0.10.12
453
444
 */
454
445
GstMessage *
455
446
gst_message_new_info (GstObject * src, GError * error, const gchar * debug)
508
499
 * The application must be prepared to receive BUFFERING messages in the
509
500
 * PREROLLING state and may only set the pipeline to PLAYING after receiving a
510
501
 * message with @percent set to 100, which can happen after the pipeline
511
 
 * completed prerolling. 
 
502
 * completed prerolling.
512
503
 *
513
504
 * MT safe.
514
505
 *
515
506
 * Returns: (transfer full): The new buffering message.
516
 
 *
517
 
 * Since: 0.10.11
518
507
 */
519
508
GstMessage *
520
509
gst_message_new_buffering (GstObject * src, gint percent)
521
510
{
522
511
  GstMessage *message;
523
512
  GstStructure *structure;
 
513
  gint64 buffering_left;
524
514
 
525
515
  g_return_val_if_fail (percent >= 0 && percent <= 100, NULL);
526
516
 
 
517
  buffering_left = (percent == 100 ? 0 : -1);
 
518
 
527
519
  structure = gst_structure_new_id (GST_QUARK (MESSAGE_BUFFERING),
528
520
      GST_QUARK (BUFFER_PERCENT), G_TYPE_INT, percent,
529
521
      GST_QUARK (BUFFERING_MODE), GST_TYPE_BUFFERING_MODE, GST_BUFFERING_STREAM,
530
522
      GST_QUARK (AVG_IN_RATE), G_TYPE_INT, -1,
531
523
      GST_QUARK (AVG_OUT_RATE), G_TYPE_INT, -1,
532
 
      GST_QUARK (BUFFERING_LEFT), G_TYPE_INT64, G_GINT64_CONSTANT (-1),
533
 
      GST_QUARK (ESTIMATED_TOTAL), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
 
524
      GST_QUARK (BUFFERING_LEFT), G_TYPE_INT64, buffering_left, NULL);
534
525
  message = gst_message_new_custom (GST_MESSAGE_BUFFERING, src, structure);
535
526
 
536
527
  return message;
557
548
  GstMessage *message;
558
549
  GstStructure *structure;
559
550
 
560
 
  structure = gst_structure_new_id (GST_QUARK (MESSAGE_STATE),
 
551
  structure = gst_structure_new_id (GST_QUARK (MESSAGE_STATE_CHANGED),
561
552
      GST_QUARK (OLD_STATE), GST_TYPE_STATE, (gint) oldstate,
562
553
      GST_QUARK (NEW_STATE), GST_TYPE_STATE, (gint) newstate,
563
554
      GST_QUARK (PENDING_STATE), GST_TYPE_STATE, (gint) pending, NULL);
690
681
 * Returns: (transfer full): the new structure change message.
691
682
 *
692
683
 * MT safe.
693
 
 *
694
 
 * Since: 0.10.22.
695
684
 */
696
685
GstMessage *
697
686
gst_message_new_structure_change (GstObject * src, GstStructureChangeType type,
870
859
/**
871
860
 * gst_message_new_async_done:
872
861
 * @src: (transfer none): The object originating the message.
873
 
 * @reset_time: if the running_time should be reset
 
862
 * @running_time: the desired running_time
874
863
 *
875
864
 * The message is posted when elements completed an ASYNC state change.
876
 
 * @reset_time is set to TRUE when the element requests a new running_time
877
 
 * before going to PLAYING.
 
865
 * @running_time contains the time of the desired running_time when this
 
866
 * elements goes to PLAYING. A value of #GST_CLOCK_TIME_NONE for @running_time
 
867
 * means that the element has no clock interaction and thus doesn't care about
 
868
 * the running_time of the pipeline.
878
869
 *
879
870
 * Returns: (transfer full): The new async_done message.
880
871
 *
881
872
 * MT safe.
882
873
 */
883
874
GstMessage *
884
 
gst_message_new_async_done (GstObject * src, gboolean reset_time)
 
875
gst_message_new_async_done (GstObject * src, GstClockTime running_time)
885
876
{
886
877
  GstMessage *message;
887
878
  GstStructure *structure;
888
879
 
889
880
  structure = gst_structure_new_id (GST_QUARK (MESSAGE_ASYNC_DONE),
890
 
      GST_QUARK (RESET_TIME), G_TYPE_BOOLEAN, reset_time, NULL);
 
881
      GST_QUARK (RUNNING_TIME), G_TYPE_UINT64, running_time, NULL);
891
882
  message = gst_message_new_custom (GST_MESSAGE_ASYNC_DONE, src, structure);
892
883
 
893
884
  return message;
903
894
 * Returns: (transfer full): The new latency message.
904
895
 *
905
896
 * MT safe.
906
 
 *
907
 
 * Since: 0.10.12
908
897
 */
909
898
GstMessage *
910
899
gst_message_new_latency (GstObject * src)
928
917
 * Returns: (transfer full): the new requst state message.
929
918
 *
930
919
 * MT safe.
931
 
 *
932
 
 * Since: 0.10.23
933
920
 */
934
921
GstMessage *
935
922
gst_message_new_request_state (GstObject * src, GstState state)
973
960
 * check the name of a custom message.
974
961
 *
975
962
 * Returns: %TRUE if @name matches the name of the message structure.
976
 
 *
977
 
 * Since: 0.10.20
978
963
 */
979
964
gboolean
980
965
gst_message_has_name (GstMessage * message, const gchar * name)
1038
1023
 * gst_message_new_buffering().
1039
1024
 *
1040
1025
 * MT safe.
1041
 
 *
1042
 
 * Since: 0.10.11
1043
1026
 */
1044
1027
void
1045
1028
gst_message_parse_buffering (GstMessage * message, gint * percent)
1062
1045
 * @buffering_left: amount of buffering time left in milliseconds
1063
1046
 *
1064
1047
 * Configures the buffering stats values in @message.
1065
 
 *
1066
 
 * Since: 0.10.20
1067
1048
 */
1068
1049
void
1069
1050
gst_message_set_buffering_stats (GstMessage * message, GstBufferingMode mode,
1088
1069
 *     milliseconds, or NULL
1089
1070
 *
1090
1071
 * Extracts the buffering stats values from @message.
1091
 
 *
1092
 
 * Since: 0.10.20
1093
1072
 */
1094
1073
void
1095
1074
gst_message_parse_buffering_stats (GstMessage * message,
1275
1254
 * Extracts the change type and completion status from the GstMessage.
1276
1255
 *
1277
1256
 * MT safe.
1278
 
 *
1279
 
 * Since: 0.10.22
1280
1257
 */
1281
1258
void
1282
1259
gst_message_parse_structure_change (GstMessage * message,
1416
1393
 * in the output arguments are copies; the caller must free them when done.
1417
1394
 *
1418
1395
 * MT safe.
1419
 
 *
1420
 
 * Since: 0.10.12
1421
1396
 */
1422
1397
void
1423
1398
gst_message_parse_info (GstMessage * message, GError ** gerror, gchar ** debug)
1542
1517
/**
1543
1518
 * gst_message_parse_async_done:
1544
1519
 * @message: A valid #GstMessage of type GST_MESSAGE_ASYNC_DONE.
1545
 
 * @reset_time: (out): Result location for the reset_time or NULL
 
1520
 * @running_time: (out): Result location for the running_time or NULL
1546
1521
 *
1547
 
 * Extract the reset_time from the async_done message.
 
1522
 * Extract the running_time from the async_done message.
1548
1523
 *
1549
1524
 * MT safe.
1550
1525
 */
1551
1526
void
1552
 
gst_message_parse_async_done (GstMessage * message, gboolean * reset_time)
 
1527
gst_message_parse_async_done (GstMessage * message, GstClockTime * running_time)
1553
1528
{
1554
1529
  GstStructure *structure;
1555
1530
 
1557
1532
  g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ASYNC_DONE);
1558
1533
 
1559
1534
  structure = GST_MESSAGE_STRUCTURE (message);
1560
 
  if (reset_time)
1561
 
    *reset_time =
1562
 
        g_value_get_boolean (gst_structure_id_get_value (structure,
1563
 
            GST_QUARK (RESET_TIME)));
 
1535
  if (running_time)
 
1536
    *running_time =
 
1537
        g_value_get_uint64 (gst_structure_id_get_value (structure,
 
1538
            GST_QUARK (RUNNING_TIME)));
1564
1539
}
1565
1540
 
1566
1541
/**
1571
1546
 * Extract the requested state from the request_state message.
1572
1547
 *
1573
1548
 * MT safe.
1574
 
 *
1575
 
 * Since: 0.10.23
1576
1549
 */
1577
1550
void
1578
1551
gst_message_parse_request_state (GstMessage * message, GstState * state)
1601
1574
 * Returns: (transfer full): the new stream status message.
1602
1575
 *
1603
1576
 * MT safe.
1604
 
 *
1605
 
 * Since: 0.10.24.
1606
1577
 */
1607
1578
GstMessage *
1608
1579
gst_message_new_stream_status (GstObject * src, GstStreamStatusType type,
1630
1601
 * should thus not be unreffed.
1631
1602
 *
1632
1603
 * MT safe.
1633
 
 *
1634
 
 * Since: 0.10.24.
1635
1604
 */
1636
1605
void
1637
1606
gst_message_parse_stream_status (GstMessage * message,
1662
1631
 *
1663
1632
 * Configures the object handling the streaming thread. This is usually a
1664
1633
 * GstTask object but other objects might be added in the future.
1665
 
 *
1666
 
 * Since: 0.10.24
1667
1634
 */
1668
1635
void
1669
1636
gst_message_set_stream_status_object (GstMessage * message,
1687
1654
 * Returns: a GValue containing the object that manages the streaming thread.
1688
1655
 * This object is usually of type GstTask but other types can be added in the
1689
1656
 * future. The object remains valid as long as @message is valid.
1690
 
 *
1691
 
 * Since: 0.10.24
1692
1657
 */
1693
1658
const GValue *
1694
1659
gst_message_get_stream_status_object (GstMessage * message)
1726
1691
 * Returns: (transfer full): the new step_done message.
1727
1692
 *
1728
1693
 * MT safe.
1729
 
 *
1730
 
 * Since: 0.10.24
1731
1694
 */
1732
1695
GstMessage *
1733
1696
gst_message_new_step_done (GstObject * src, GstFormat format, guint64 amount,
1764
1727
 * Extract the values the step_done message.
1765
1728
 *
1766
1729
 * MT safe.
1767
 
 *
1768
 
 * Since: 0.10.24
1769
1730
 */
1770
1731
void
1771
1732
gst_message_parse_step_done (GstMessage * message, GstFormat * format,
1812
1773
 * Returns: (transfer full): The new step_start message. 
1813
1774
 *
1814
1775
 * MT safe.
1815
 
 *
1816
 
 * Since: 0.10.24
1817
1776
 */
1818
1777
GstMessage *
1819
1778
gst_message_new_step_start (GstObject * src, gboolean active, GstFormat format,
1847
1806
 * Extract the values from step_start message.
1848
1807
 *
1849
1808
 * MT safe.
1850
 
 *
1851
 
 * Since: 0.10.24
1852
1809
 */
1853
1810
void
1854
1811
gst_message_parse_step_start (GstMessage * message, gboolean * active,
1896
1853
 * Returns: (transfer full): The new qos message.
1897
1854
 *
1898
1855
 * MT safe.
1899
 
 *
1900
 
 * Since: 0.10.29
1901
1856
 */
1902
1857
GstMessage *
1903
1858
gst_message_new_qos (GstObject * src, gboolean live, guint64 running_time,
1935
1890
 * Set the QoS values that have been calculated/analysed from the QoS data
1936
1891
 *
1937
1892
 * MT safe.
1938
 
 *
1939
 
 * Since: 0.10.29
1940
1893
 */
1941
1894
void
1942
1895
gst_message_set_qos_values (GstMessage * message, gint64 jitter,
1972
1925
 * invalid. Values of -1 for either @processed or @dropped mean unknown values.
1973
1926
 *
1974
1927
 * MT safe.
1975
 
 *
1976
 
 * Since: 0.10.29
1977
1928
 */
1978
1929
void
1979
1930
gst_message_set_qos_stats (GstMessage * message, GstFormat format,
2011
1962
 * values.
2012
1963
 *
2013
1964
 * MT safe.
2014
 
 *
2015
 
 * Since: 0.10.29
2016
1965
 */
2017
1966
void
2018
1967
gst_message_parse_qos (GstMessage * message, gboolean * live,
2047
1996
 * Extract the QoS values that have been calculated/analysed from the QoS data
2048
1997
 *
2049
1998
 * MT safe.
2050
 
 *
2051
 
 * Since: 0.10.29
2052
1999
 */
2053
2000
void
2054
2001
gst_message_parse_qos_values (GstMessage * message, gint64 * jitter,
2085
2032
 * invalid. Values of -1 for either @processed or @dropped mean unknown values.
2086
2033
 *
2087
2034
 * MT safe.
2088
 
 *
2089
 
 * Since: 0.10.29
2090
2035
 */
2091
2036
void
2092
2037
gst_message_parse_qos_stats (GstMessage * message, GstFormat * format,
2118
2063
 * @test should contain a user visible string detailing the current action.
2119
2064
 *
2120
2065
 * Returns: (transfer full): The new qos message.
2121
 
 *
2122
 
 * Since: 0.10.33
2123
2066
 */
2124
2067
GstMessage *
2125
2068
gst_message_new_progress (GstObject * src, GstProgressType type,
2154
2097
 * @text: (out) (allow-none) (transfer full): location for the text
2155
2098
 *
2156
2099
 * Parses the progress @type, @code and @text.
2157
 
 *
2158
 
 * Since: 0.10.33
2159
2100
 */
2160
2101
void
2161
2102
gst_message_parse_progress (GstMessage * message, GstProgressType * type,
2176
2117
/**
2177
2118
 * gst_message_new_toc:
2178
2119
 * @src: the object originating the message.
2179
 
 * @toc: #GstToc structure for the message.
 
2120
 * @toc: (transfer none): #GstToc structure for the message.
2180
2121
 * @updated: whether TOC was updated or not.
2181
2122
 *
2182
2123
 * Create a new TOC message. The message is posted by elements
2183
2124
 * that discovered or updated a TOC.
2184
2125
 *
2185
 
 * Returns: a new TOC message.
 
2126
 * Returns: (transfer full): a new TOC message.
2186
2127
 *
2187
2128
 * MT safe.
2188
 
 *
2189
 
 * Since: 0.10.37
2190
2129
 */
2191
2130
GstMessage *
2192
2131
gst_message_new_toc (GstObject * src, GstToc * toc, gboolean updated)
2195
2134
 
2196
2135
  g_return_val_if_fail (toc != NULL, NULL);
2197
2136
 
2198
 
  toc_struct = __gst_toc_to_structure (toc);
 
2137
  toc_struct = gst_structure_new_id (GST_QUARK (MESSAGE_TOC),
 
2138
      GST_QUARK (TOC), GST_TYPE_TOC, toc,
 
2139
      GST_QUARK (UPDATED), G_TYPE_BOOLEAN, updated, NULL);
2199
2140
 
2200
 
  if (G_LIKELY (toc_struct != NULL)) {
2201
 
    __gst_toc_structure_set_updated (toc_struct, updated);
2202
 
    return gst_message_new_custom (GST_MESSAGE_TOC, src, toc_struct);
2203
 
  } else
2204
 
    return NULL;
 
2141
  return gst_message_new_custom (GST_MESSAGE_TOC, src, toc_struct);
2205
2142
}
2206
2143
 
2207
2144
/**
2208
2145
 * gst_message_parse_toc:
2209
2146
 * @message: a valid #GstMessage of type GST_MESSAGE_TOC.
2210
 
 * @toc: (out): return location for the TOC.
 
2147
 * @toc: (out) (transfer full): return location for the TOC.
2211
2148
 * @updated: (out): return location for the updated flag.
2212
2149
 *
2213
2150
 * Extract thef TOC from the #GstMessage. The TOC returned in the
2214
2151
 * output argument is a copy; the caller must free it with
2215
 
 * gst_toc_free() when done.
 
2152
 * gst_toc_unref() when done.
2216
2153
 *
2217
2154
 * MT safe.
2218
 
 *
2219
 
 * Since: 0.10.37
2220
2155
 */
2221
2156
void
2222
2157
gst_message_parse_toc (GstMessage * message, GstToc ** toc, gboolean * updated)
2225
2160
  g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_TOC);
2226
2161
  g_return_if_fail (toc != NULL);
2227
2162
 
2228
 
  *toc = __gst_toc_from_structure (GST_MESSAGE_STRUCTURE (message));
2229
 
 
2230
 
  if (updated != NULL)
2231
 
    *updated =
2232
 
        __gst_toc_structure_get_updated (GST_MESSAGE_STRUCTURE (message));
 
2163
  gst_structure_id_get (GST_MESSAGE_STRUCTURE (message),
 
2164
      GST_QUARK (TOC), GST_TYPE_TOC, toc,
 
2165
      GST_QUARK (UPDATED), G_TYPE_BOOLEAN, updated, NULL);
 
2166
}
 
2167
 
 
2168
/**
 
2169
 * gst_message_new_reset_time:
 
2170
 * @src: (transfer none): The object originating the message.
 
2171
 * @running_time: the requested running-time
 
2172
 *
 
2173
 * This message is posted when the pipeline running-time should be reset to
 
2174
 * @running_time, like after a flushing seek.
 
2175
 *
 
2176
 * Returns: (transfer full): The new reset_time message.
 
2177
 *
 
2178
 * MT safe.
 
2179
 */
 
2180
GstMessage *
 
2181
gst_message_new_reset_time (GstObject * src, GstClockTime running_time)
 
2182
{
 
2183
  GstMessage *message;
 
2184
  GstStructure *structure;
 
2185
 
 
2186
  structure = gst_structure_new_id (GST_QUARK (MESSAGE_RESET_TIME),
 
2187
      GST_QUARK (RUNNING_TIME), G_TYPE_UINT64, running_time, NULL);
 
2188
  message = gst_message_new_custom (GST_MESSAGE_RESET_TIME, src, structure);
 
2189
 
 
2190
  return message;
 
2191
}
 
2192
 
 
2193
/**
 
2194
 * gst_message_parse_reset_time:
 
2195
 * @message: A valid #GstMessage of type GST_MESSAGE_RESET_TIME.
 
2196
 * @running_time: (out): Result location for the running_time or NULL
 
2197
 *
 
2198
 * Extract the running-time from the RESET_TIME message.
 
2199
 *
 
2200
 * MT safe.
 
2201
 */
 
2202
void
 
2203
gst_message_parse_reset_time (GstMessage * message, GstClockTime * running_time)
 
2204
{
 
2205
  GstStructure *structure;
 
2206
 
 
2207
  g_return_if_fail (GST_IS_MESSAGE (message));
 
2208
  g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_RESET_TIME);
 
2209
 
 
2210
  structure = GST_MESSAGE_STRUCTURE (message);
 
2211
  if (running_time)
 
2212
    *running_time =
 
2213
        g_value_get_uint64 (gst_structure_id_get_value (structure,
 
2214
            GST_QUARK (RUNNING_TIME)));
 
2215
}
 
2216
 
 
2217
/**
 
2218
 * gst_message_new_stream_start:
 
2219
 * @src: (transfer none): The object originating the message.
 
2220
 *
 
2221
 * Create a new stream_start message. This message is generated and posted in
 
2222
 * the sink elements of a GstBin. The bin will only forward the STREAM_START
 
2223
 * message to the application if all sinks have posted an STREAM_START message.
 
2224
 *
 
2225
 * Returns: (transfer full): The new stream_start message.
 
2226
 *
 
2227
 * MT safe.
 
2228
 */
 
2229
GstMessage *
 
2230
gst_message_new_stream_start (GstObject * src)
 
2231
{
 
2232
  GstMessage *message;
 
2233
 
 
2234
  message = gst_message_new_custom (GST_MESSAGE_STREAM_START, src, NULL);
 
2235
 
 
2236
  return message;
2233
2237
}