mirror of
https://github.com/mpv-player/mpv
synced 2025-04-11 04:01:31 +00:00
Free track data if error occurs while reading trackentry
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@20141 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
489846074c
commit
ccff4a6164
@ -1015,6 +1015,31 @@ demux_mkv_read_trackvideo (demuxer_t *demuxer, mkv_track_t *track)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief free any data associated with given track
|
||||||
|
* \param track track of which to free data
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
demux_mkv_free_trackentry(mkv_track_t *track) {
|
||||||
|
if (track->name)
|
||||||
|
free (track->name);
|
||||||
|
if (track->codec_id)
|
||||||
|
free (track->codec_id);
|
||||||
|
if (track->language)
|
||||||
|
free (track->language);
|
||||||
|
if (track->private_data)
|
||||||
|
free (track->private_data);
|
||||||
|
if (track->audio_buf)
|
||||||
|
free (track->audio_buf);
|
||||||
|
if (track->audio_timestamp)
|
||||||
|
free (track->audio_timestamp);
|
||||||
|
#ifdef USE_ASS
|
||||||
|
if (track->sh_sub.ass_track)
|
||||||
|
ass_free_track (track->sh_sub.ass_track);
|
||||||
|
#endif
|
||||||
|
demux_mkv_free_encodings(track->encodings, track->num_encodings);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
demux_mkv_read_trackentry (demuxer_t *demuxer)
|
demux_mkv_read_trackentry (demuxer_t *demuxer)
|
||||||
{
|
{
|
||||||
@ -1040,7 +1065,7 @@ demux_mkv_read_trackentry (demuxer_t *demuxer)
|
|||||||
{
|
{
|
||||||
uint64_t num = ebml_read_uint (s, &l);
|
uint64_t num = ebml_read_uint (s, &l);
|
||||||
if (num == EBML_UINT_INVALID)
|
if (num == EBML_UINT_INVALID)
|
||||||
return 0;
|
goto err_out;
|
||||||
track->tnum = num;
|
track->tnum = num;
|
||||||
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
|
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
|
||||||
track->tnum);
|
track->tnum);
|
||||||
@ -1051,7 +1076,7 @@ demux_mkv_read_trackentry (demuxer_t *demuxer)
|
|||||||
{
|
{
|
||||||
track->name = ebml_read_utf8 (s, &l);
|
track->name = ebml_read_utf8 (s, &l);
|
||||||
if (track->name == NULL)
|
if (track->name == NULL)
|
||||||
return 0;
|
goto err_out;
|
||||||
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Name: %s\n",
|
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Name: %s\n",
|
||||||
track->name);
|
track->name);
|
||||||
break;
|
break;
|
||||||
@ -1086,20 +1111,20 @@ demux_mkv_read_trackentry (demuxer_t *demuxer)
|
|||||||
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
|
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
|
||||||
l = demux_mkv_read_trackaudio (demuxer, track);
|
l = demux_mkv_read_trackaudio (demuxer, track);
|
||||||
if (l == 0)
|
if (l == 0)
|
||||||
return 0;
|
goto err_out;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MATROSKA_ID_TRACKVIDEO:
|
case MATROSKA_ID_TRACKVIDEO:
|
||||||
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Video track\n");
|
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Video track\n");
|
||||||
l = demux_mkv_read_trackvideo (demuxer, track);
|
l = demux_mkv_read_trackvideo (demuxer, track);
|
||||||
if (l == 0)
|
if (l == 0)
|
||||||
return 0;
|
goto err_out;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MATROSKA_ID_CODECID:
|
case MATROSKA_ID_CODECID:
|
||||||
track->codec_id = ebml_read_ascii (s, &l);
|
track->codec_id = ebml_read_ascii (s, &l);
|
||||||
if (track->codec_id == NULL)
|
if (track->codec_id == NULL)
|
||||||
return 0;
|
goto err_out;
|
||||||
if (!strcmp (track->codec_id, MKV_V_MSCOMP) ||
|
if (!strcmp (track->codec_id, MKV_V_MSCOMP) ||
|
||||||
!strcmp (track->codec_id, MKV_A_ACM))
|
!strcmp (track->codec_id, MKV_A_ACM))
|
||||||
track->ms_compat = 1;
|
track->ms_compat = 1;
|
||||||
@ -1131,7 +1156,7 @@ demux_mkv_read_trackentry (demuxer_t *demuxer)
|
|||||||
l = x + num;
|
l = x + num;
|
||||||
track->private_data = malloc (num);
|
track->private_data = malloc (num);
|
||||||
if (stream_read(s, track->private_data, num) != (int) num)
|
if (stream_read(s, track->private_data, num) != (int) num)
|
||||||
return 0;
|
goto err_out;
|
||||||
track->private_size = num;
|
track->private_size = num;
|
||||||
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length "
|
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length "
|
||||||
"%u\n", track->private_size);
|
"%u\n", track->private_size);
|
||||||
@ -1141,7 +1166,7 @@ demux_mkv_read_trackentry (demuxer_t *demuxer)
|
|||||||
case MATROSKA_ID_TRACKLANGUAGE:
|
case MATROSKA_ID_TRACKLANGUAGE:
|
||||||
track->language = ebml_read_utf8 (s, &l);
|
track->language = ebml_read_utf8 (s, &l);
|
||||||
if (track->language == NULL)
|
if (track->language == NULL)
|
||||||
return 0;
|
goto err_out;
|
||||||
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
|
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
|
||||||
track->language);
|
track->language);
|
||||||
break;
|
break;
|
||||||
@ -1150,7 +1175,7 @@ demux_mkv_read_trackentry (demuxer_t *demuxer)
|
|||||||
{
|
{
|
||||||
uint64_t num = ebml_read_uint (s, &l);
|
uint64_t num = ebml_read_uint (s, &l);
|
||||||
if (num == EBML_UINT_INVALID)
|
if (num == EBML_UINT_INVALID)
|
||||||
return 0;
|
goto err_out;
|
||||||
track->default_track = num;
|
track->default_track = num;
|
||||||
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
|
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
|
||||||
track->default_track);
|
track->default_track);
|
||||||
@ -1161,7 +1186,7 @@ demux_mkv_read_trackentry (demuxer_t *demuxer)
|
|||||||
{
|
{
|
||||||
uint64_t num = ebml_read_uint (s, &l);
|
uint64_t num = ebml_read_uint (s, &l);
|
||||||
if (num == EBML_UINT_INVALID)
|
if (num == EBML_UINT_INVALID)
|
||||||
return 0;
|
goto err_out;
|
||||||
if (num == 0)
|
if (num == 0)
|
||||||
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: 0");
|
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: 0");
|
||||||
else
|
else
|
||||||
@ -1177,7 +1202,7 @@ demux_mkv_read_trackentry (demuxer_t *demuxer)
|
|||||||
case MATROSKA_ID_TRACKENCODINGS:
|
case MATROSKA_ID_TRACKENCODINGS:
|
||||||
l = demux_mkv_read_trackencodings (demuxer, track);
|
l = demux_mkv_read_trackencodings (demuxer, track);
|
||||||
if (l == 0)
|
if (l == 0)
|
||||||
return 0;
|
goto err_out;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1189,6 +1214,11 @@ demux_mkv_read_trackentry (demuxer_t *demuxer)
|
|||||||
|
|
||||||
mkv_d->tracks[mkv_d->num_tracks++] = track;
|
mkv_d->tracks[mkv_d->num_tracks++] = track;
|
||||||
return len;
|
return len;
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
demux_mkv_free_trackentry(track);
|
||||||
|
free(track);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -2702,26 +2732,7 @@ demux_close_mkv (demuxer_t *demuxer)
|
|||||||
if (mkv_d->tracks)
|
if (mkv_d->tracks)
|
||||||
{
|
{
|
||||||
for (i=0; i<mkv_d->num_tracks; i++)
|
for (i=0; i<mkv_d->num_tracks; i++)
|
||||||
{
|
demux_mkv_free_trackentry(mkv_d->tracks[i]);
|
||||||
if (mkv_d->tracks[i]->name)
|
|
||||||
free (mkv_d->tracks[i]->name);
|
|
||||||
if (mkv_d->tracks[i]->codec_id)
|
|
||||||
free (mkv_d->tracks[i]->codec_id);
|
|
||||||
if (mkv_d->tracks[i]->language)
|
|
||||||
free (mkv_d->tracks[i]->language);
|
|
||||||
if (mkv_d->tracks[i]->private_data)
|
|
||||||
free (mkv_d->tracks[i]->private_data);
|
|
||||||
if (mkv_d->tracks[i]->audio_buf)
|
|
||||||
free (mkv_d->tracks[i]->audio_buf);
|
|
||||||
if (mkv_d->tracks[i]->audio_timestamp)
|
|
||||||
free (mkv_d->tracks[i]->audio_timestamp);
|
|
||||||
#ifdef USE_ASS
|
|
||||||
if (mkv_d->tracks[i]->sh_sub.ass_track)
|
|
||||||
ass_free_track (mkv_d->tracks[i]->sh_sub.ass_track);
|
|
||||||
#endif
|
|
||||||
demux_mkv_free_encodings(mkv_d->tracks[i]->encodings,
|
|
||||||
mkv_d->tracks[i]->num_encodings);
|
|
||||||
}
|
|
||||||
for (i=0; i < SUB_MAX_TEXT; i++)
|
for (i=0; i < SUB_MAX_TEXT; i++)
|
||||||
if (mkv_d->subs.text[i])
|
if (mkv_d->subs.text[i])
|
||||||
free (mkv_d->subs.text[i]);
|
free (mkv_d->subs.text[i]);
|
||||||
|
Loading…
Reference in New Issue
Block a user