u = u->next;
}
+ if (na == &ures) {
+ /* Copy the local temporary to the heap */
+ na = xnew(struct ase_interval_union_item_s);
+ assert(na);
+ memcpy(na,&ures,sizeof(ures));
+ }
return na;
}
__ase_interval_union_rational(ase_interval_union_item_t u)
{
int i = 0, nargs = __ase_interval_union_update_rational(u);
- Lisp_Object args[nargs];
-
if (nargs == 0)
return Qzero;
-
- while (u) {
- if (ASE_INTERVALP(u->current)) {
- args[i] = _ase_interval_rational(
- XASE_INTERVAL(u->current));
- } else if (ASE_INTERVAL_INTERIOR_P(u->current)) {
- args[i] = _ase_interval_interior_rational(
- XASE_CARTESIAN(u->current));
+ {
+ Lisp_Object args[nargs];
+ for ( i = nargs; i > 0; )
+ args[--i] = Qnil;
+
+ while (u) {
+ if (ASE_INTERVALP(u->current)) {
+ args[i] = _ase_interval_rational(
+ XASE_INTERVAL(u->current));
+ } else if (ASE_INTERVAL_INTERIOR_P(u->current)) {
+ args[i] = _ase_interval_interior_rational(
+ XASE_CARTESIAN(u->current));
+ }
+ i++;
+ u = u->next;
}
- i++;
- u = u->next;
+ return ent_binop_many(ASE_BINARY_OP_SUM, nargs, args);
}
- return ent_binop_many(ASE_BINARY_OP_SUM, nargs, args);
}
static inline void
avfc = media_stream_data(ms);
out = xmalloc_atomic(chars_left+1);
out[0] = '\0';
+ out[chars_left] = '\0';
/* cannot use ffmpeg on corrupt streams */
if (media_stream_driver(ms) != MYSELF || avfc == NULL)
return out;
if (avfc->author && *avfc->author) {
- strcat(out, " :author \"");
+ strncat(out, " :author \"", chars_left);
+ chars_left -= 10;
strncat(out, avfc->author, chars_left);
- strcat(out, "\"");
- chars_left -= 560;
+ chars_left -= strlen(avfc->author);
+ strncat(out, "\"", chars_left--);
}
if (avfc->title && *avfc->title) {
- strcat(out, " :title: \"");
+ strncat(out, " :title: \"", chars_left);
+ chars_left -= 10;
strncat(out, avfc->title, chars_left);
- strcat(out, "\"");
- chars_left -= 560;
+ chars_left -= strlen(avfc->title);
+ strncat(out, "\"", chars_left--);
}
if (avfc->year) {
char year[12];
- strcat(out, " :year ");
+ strncat(out, " :year ", chars_left);
+ chars_left -= 7;
snprintf(year, 12, "%d", avfc->year);
strncat(out, year, chars_left);
- chars_left -= 24;
}
return out;
const char *name = NULL;
const char *codec_name = NULL;
/* libavformat cruft */
- AVStream *avst;
- AVCodecContext *avcc;
+ AVStream *avst = NULL;
+ AVCodecContext *avcc = NULL;
/* unpack the stream and codec context from the container, again */
- avst = avfc->streams[st];
- avcc = avst->codec;
+ if (avfc)
+ avst = avfc->streams[st];
+ if (avst)
+ avcc = avst->codec;
/* initialise */
mtap = xnew_and_zero(mtype_audio_properties);
mtap->name = name;
mtap->codec_name = codec_name;
- mtap->channels = avcc->channels;
- mtap->samplerate = avcc->sample_rate;
- mtap->bitrate = media_ffmpeg_bitrate(avcc);
+ if (avcc ) {
+ mtap->channels = avcc->channels;
+ mtap->samplerate = avcc->sample_rate;
+ mtap->bitrate = media_ffmpeg_bitrate(avcc);
+ }
/* samplewidth and framesize */
switch (avcc->sample_fmt) {
const char *name = NULL;
const char *codec_name = NULL;
/* libavformat cruft */
- AVStream *avst;
- AVCodecContext *avcc;
+ AVStream *avst = NULL;
+ AVCodecContext *avcc = NULL;
/* unpack the stream and codec context from the container, again */
- avst = avfc->streams[st];
- avcc = avst->codec;
+ if (avfc)
+ avst = avfc->streams[st];
+ if (avst)
+ avcc = avst->codec;
/* initialise */
mtvp = xnew_and_zero(mtype_video_properties);
mtvp->name = name;
mtvp->codec_name = codec_name;
- mtvp->bitrate = avcc->bit_rate;
- mtvp->width = avcc->width;
- mtvp->height = avcc->height;
- mtvp->aspect_num = avcc->sample_aspect_ratio.num;
- mtvp->aspect_den = avcc->sample_aspect_ratio.den;
+ if (avcc) {
+ mtvp->bitrate = avcc->bit_rate;
+ mtvp->width = avcc->width;
+ mtvp->height = avcc->height;
+ mtvp->aspect_num = avcc->sample_aspect_ratio.num;
+ mtvp->aspect_den = avcc->sample_aspect_ratio.den;
+ }
mtvp->endianness = 0;
break;
}
- /* check if there is at least one usable stream */
- for (size_t st = 0; st < avfc->nb_streams; st++) {
- avst = avfc->streams[st];
- avcc = avst->codec;
- if (avcc &&
- avcc->codec_id != CODEC_ID_NONE &&
- avcc->codec_type != CODEC_TYPE_DATA &&
- (avc = avcodec_find_decoder(avcc->codec_id)) &&
- (avc && (avcodec_open(avcc, avc) >= 0))) {
-
- /* create a substream */
- mss = make_media_substream_append(ms);
-
- switch ((unsigned int)avcc->codec_type) {
- case CODEC_TYPE_VIDEO:
- /* assign substream props */
- media_substream_type(mss) = MTYPE_VIDEO;
- media_ffmpeg_analyse_video(mss, avfc, st);
- break;
- case CODEC_TYPE_AUDIO:
- /* assign substream props */
- media_substream_type(mss) = MTYPE_AUDIO;
- media_ffmpeg_analyse_audio(mss, avfc, st);
- /* set some stream handlers */
- media_stream_set_meths(ms, media_ffmpeg);
- break;
- case CODEC_TYPE_DATA:
- media_substream_type(mss) = MTYPE_IMAGE;
- break;
- default:
- media_substream_type(mss) = MTYPE_UNKNOWN;
- break;
+ if (avfc)
+ /* check if there is at least one usable stream */
+ for (size_t st = 0; st < avfc->nb_streams; st++) {
+ avst = avfc->streams[st];
+ avcc = avst->codec;
+ if (avcc &&
+ avcc->codec_id != CODEC_ID_NONE &&
+ avcc->codec_type != CODEC_TYPE_DATA &&
+ (avc = avcodec_find_decoder(avcc->codec_id)) &&
+ (avc && (avcodec_open(avcc, avc) >= 0))) {
+
+ /* create a substream */
+ mss = make_media_substream_append(ms);
+
+ switch ((unsigned int)avcc->codec_type) {
+ case CODEC_TYPE_VIDEO:
+ /* assign substream props */
+ media_substream_type(mss) = MTYPE_VIDEO;
+ media_ffmpeg_analyse_video(mss, avfc, st);
+ break;
+ case CODEC_TYPE_AUDIO:
+ /* assign substream props */
+ media_substream_type(mss) = MTYPE_AUDIO;
+ media_ffmpeg_analyse_audio(mss, avfc, st);
+ /* set some stream handlers */
+ media_stream_set_meths(ms, media_ffmpeg);
+ break;
+ case CODEC_TYPE_DATA:
+ media_substream_type(mss) = MTYPE_IMAGE;
+ break;
+ default:
+ media_substream_type(mss) = MTYPE_UNKNOWN;
+ break;
+ }
}
}
- }
-
+
/* keep the format context */
media_stream_data(ms) = avfc;
/* ... and play it */
SXE_MUTEX_LOCK(&aj->mtx);
+ mtp = aj->play_state;
if (aj->buffer_alloc_size < SOUND_MAX_AUDIO_FRAME_SIZE) {
alloced_myself = 1;
aj->buffer = xmalloc_atomic(SOUND_MAX_AUDIO_FRAME_SIZE);
#endif
SXE_MUTEX_LOCK(&aj->mtx);
- mtp = aj->play_state;
- SXE_MUTEX_UNLOCK(&aj->mtx);
- switch (mtp) {
+ switch (aj->play_state) {
case MTPSTATE_RUN:
- if (!ao_push(aj, resolution)) {
- SXE_MUTEX_LOCK(&aj->mtx);
- mtp = aj->play_state = MTPSTATE_STOP;
- SXE_MUTEX_UNLOCK(&aj->mtx);
- }
+ if (!ao_push(aj, resolution))
+ aj->play_state = MTPSTATE_STOP;
break;
case MTPSTATE_PAUSE:
- AO_DEBUG("sleeping for %d\n", resolution);
- usleep(resolution);
- break;
+ /* must sleep resolution outside of lock */
case MTPSTATE_UNKNOWN:
case MTPSTATE_STOP:
case NUMBER_OF_MEDIA_THREAD_PLAY_STATES:
default:
AO_DEBUG("ACK, quit\n");
- SXE_MUTEX_LOCK(&aj->mtx);
- mtp = aj->play_state = MTPSTATE_STOP;
- SXE_MUTEX_UNLOCK(&aj->mtx);
+ aj->play_state = MTPSTATE_STOP;
+ break;
+ }
+ mtp = aj->play_state
+ SXE_MUTEX_UNLOCK(&aj->mtx);
+ if (mtp == MTPSTATE_PAUSE) {
+ AO_DEBUG("sleeping for %d\n", resolution);
+ usleep(resolution);
break;
}
}
cachel = GLYPH_CACHEL(w, CONT_GLYPH_INDEX);
}
- add_glyph_rune(&data, &gb, BEGIN_GLYPHS, 0, cachel);
+ add_glyph_rune_noret(&data, &gb, BEGIN_GLYPHS, 0, cachel);
if (truncate_win && data.bi_bufpos == BI_BUF_ZV(b)
&& BI_BUF_FETCH_CHAR(b,
data->blank_width = space_width(XWINDOW(data->window));
while (Dynarr_length(db->runes) < pos)
- add_blank_rune(data, NULL, 0);
+ add_blank_rune_noret(data, NULL, 0);
end = (Dynarr_length(db->runes) +
bytecount_to_charcount(str, strlen((const char *)str)));
while (Dynarr_length(db->runes) < pos &&
(data->pixpos + data->blank_width <= data->max_pixpos))
- add_blank_rune(data, NULL, 0);
+ add_blank_rune_noret(data, NULL, 0);
return Dynarr_length(db->runes);
}